星链,是美国太空探索技术公司的一个项目,太空探索技术公司计划在2019年至2024年间在太空搭建由约1.2万颗卫星组成的“星链”网络提供互联网服务,其中1584颗将部署在地球上空550千米处的近地轨道,并从2020年开始工作。
思路:
双指针:先判断是否只有一个节点,一个的话,直接返回; 若大于等于2个节点,则启用双指针遍历,循环接续的条件是前方指针为null. 手动实现时才发现需要考虑太多细节....
Code:
#pragma once
#include <vector>
class ReverseList
{
public:
struct Node {
Node(int v=0, Node* p=nullptr):val(v),next(p) {}
int val;
Node* next;
};
Node* reverseList(Node* head)
{
if (nullptr == head) {
return nullptr;
}
//双指针法:
Node* pFirst = head;
Node* pNext = head->next;
//判断是否只有1个节点
if (nullptr == pNext) {
return head;
}
else {
while (pNext) {
Node* pCache = pNext->next;//先保存以下pNext的下一个
pNext->next = pFirst;
//pFirst->next = nullptr;
//两个指针起头并进:
pFirst = pNext;
pNext = pCache;
}
head->next = nullptr;
head = pFirst;
}
}
void prinList(Node* pHead)
{
if (nullptr == pHead) {
return;
}
Node* pTrav = pHead;
while (pTrav) {
printf("%d ",pTrav->val);
pTrav = pTrav->next;
}
printf("\n");
}
//根据vector中的元素产生一个单项链表
Node* generateList(std::vector<int> nodesVect) {
if (nodesVect.empty())
return nullptr;
int N = nodesVect.size();
if (1 == N) {
Node* p = new Node(nodesVect[0]);
return p;
}
else {
Node* pHead = new Node(nodesVect[0]);//先产生头
//然后,为vector中的剩余元素产生Node
Node* pTrav = pHead;
for (int i = 1; i < N; i++) {
Node* p = new Node(nodesVect[i]);
pTrav->next = p;
pTrav = p;
}
return pHead;
}
}
void Test() {
std::vector<int> vec1 = {1,2,3,4};
Node* pHead = generateList(vec1);
prinList(pHead);
pHead = reverseList(pHead);
prinList(pHead);
}
void Test2() {
std::vector<int> vec1 = { 1,2 };
Node* pHead = generateList(vec1);
prinList(pHead);
pHead = reverseList(pHead);
prinList(pHead);
}
void Test3() {
std::vector<int> vec1 = { 1 };
Node* pHead = generateList(vec1);
prinList(pHead);
pHead = reverseList(pHead);
prinList(pHead);
}
};
void main() {
ReverseList obj;
obj.Test();
obj.Test2();
obj.Test3();
}