经典到再也不能经典的问题了把,链表题一定要多画图,否则能调试1天。
题目
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
经典反转链表
该图描述了逆转链表时候的顺序
画图画的,忍忍。
我们从最小的来看,如何反转两个相邻节点呢?
我们需要将后面的节点的next域指向前面即可。
再来看上图,如果我们直接把last的next域指向了pre,那么后面的节点我们是找不到的,这是由单链表的性质决定的。所以我们需要先把last后面节点记录下,然后将last的next指向pre,然后pre跳到last的位置,last跳到t的位置…如此下去,我们能够将链表的所有结点反转。
什么时候结束?
当last为空时候,是不是就说明单链表都逆转完了,那这个时候pre就是逆转后的链表头。
AC代码
写代码的时候需要按照上图的顺序来修改指针的指向。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
//特判链表空
if (head == NULL) return head;
//两个指针顺次向后移动
auto pre = head, last = head->next;
pre->next = NULL;//第一个节点最后要指向空
while (last){
auto t = last->next;
last->next = pre;
pre = last;
last = t;
}
return pre;
}
};
由于逆转后,原链表头的next域是NULL,所以一开始我们就需要将head的next域设为NULL