题目描述
输入一个链表,反转链表后,输出链表的头结点。
分析一波:动手一画便能找到方法。就地逆置的时候,需要有一个指针保存已经逆置部分的“头”结点,有一个指针指向当前未逆置的部分的头结点,有一个指针保存后继。相当于前驱,当前,后继。
在实现代码中特别要注意终止的时候,一定要执行最后一次逆置操作,把尾结点链入逆置链表中,这一点很容易出错。
代码:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(!pHead || pHead->next == NULL) return pHead;
ListNode *left = NULL; //前驱
ListNode *p = pHead; //当前
ListNode *res = NULL; //结果
while(p != NULL) //注意条件,需要对尾结点执行循环体操作
{
ListNode *right = p->next; //后继
if(right == NULL)
res = p;
p->next = left;
left = p;
p = right;
}
return res;
}
};