本文最后更新于:2020年6月28日 下午

题目描述:

输入一个链表,反转链表后,输出链表的所有元素。

实现如下:

//此题在线用例还是无头链表→_→
//1<-2<-3 4->5
//   p  s q
//保证三个指针指向相邻的三个节点
//健壮性:
//1.传入空指针
//2.链表中只有一个节点
/*节点结构体定义
struct ListNode 
{
	int val;
	struct ListNode *next;
	ListNode(int x) : val(x), next(NULL) {}
};
*/
class Solution 
{
public:
	ListNode* ReverseList(ListNode* pHead) 
	{
		if (pHead == NULL) return NULL;//放置传入空指针

		ListNode *p = pHead;
		ListNode *s = pHead->next;
		ListNode *q = pHead;
		p->next = NULL;//首先将第一个节点的next赋值为NULL
		while (s != NULL)//判断是否还有为反转节点
		{
			q = s->next;//预先保存s的next
			s->next = p;//连到已反转链表
			p = s;//指向已反转链表的第一个节点
			s = q;//指向未反转链表的第一个节点
		}
		return p;
	}
};

//使用两个指针,用pHead代替上面方法的p的作用
class Solution
{
public:
	ListNode* ReverseList(ListNode* pHead)
	{
		if (pHead == NULL) return NULL;

		ListNode *p = pHead;
		ListNode *s = pHead->next;
		pHead->next = NULL;
		while (s != NULL)
		{
			p = s;
			s = s->next;//保存下一个未反转节点
			p->next = pHead;
			pHead = p;
		}
		return pHead;
	}
};