反转链表难处在三指针滑动的逻辑,可参考博文:图解反转单向链表
鉴于老是忘记,特加解释:
- 首先我们需要创建一个新的链表来储存逆序链表
- 其次我们要把原链表第一个节点断开并指向新链表的表头
- 现在我们要把新链表表头向前移动一位,因为我们需要的是这个新链表的头部
- 再把旧链表的头移动到下一个节点,因为原本的头已经被我们砍下并指向了新链表。为了将旧链表表头指向下一位,这需要用到我们在第二步之前保存的旧链表表头下一位的信息。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
ListNode* head=pHead;
ListNode* pre=NULL; //创建新链表头部指向NULL
while(head)
{
ListNode* next=head->next; //保存该节点指向的下一个节点
head->next=pre; //断开该节点,并使其指向新链表头部pre
pre=head; //使pre滑动到新加入的节点
head=next; //滑动到下一个节点继续重复操作
}
return pre;
}
};