单向链表的反转

 


星链,是美国太空探索技术公司的一个项目,太空探索技术公司计划在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();
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

First Snowflakes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值