LeetCode 206. Reverse Linked List
原题链接
简单
作者:
贺谦
,
2020-05-01 11:01:18
,
所有人可见
,
阅读 728
算法1(迭代)
解题思路
- 定义3个指针变量,
cur
表示当前指向的节点,next
表示cur
翻转前指向的后继节点,prev
表示翻转后cur
指向的“后继结点”(也就是前驱节点)。
next
指针一定要放在while()中,不然不能实时更新,会RE。
- 逻辑:用next存储cur的后继cur->next,为了cur指针向后遍历而存在,使用next存储了cur->next的值以后,就可以实现翻转了,让cur->next指向prev,然后prev更新
prev = cur
,最后cur向后移动一格,用到了之前定义的next
变量,cur = next
。
代码
/**
* 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) {
ListNode *prev = NULL;
ListNode *cur = head;
while(cur)
{
ListNode *next = cur->next;
cur->next = prev, prev = cur, cur = next;
}
return prev;
}
};
算法2(递归)
解题思路
- 样例中是
1 2 3 4 5
,从2
为头结点开始递归,调用reversList()函数,得到5 4 3 2
- 此时的链表并不是
1 5 4 3 2
,这样想是错的,此时的链表是1->2
和5 4 3 2
,也就是头结点1
依然指向的是2
,只不过2现在是新链表(以tail 5为头结点的链表)的尾节点了,想要访问到2
,就使用head->next
就可以。
- 让
2
指向1,让1
指向NULL,就可以实现翻转。head->next->next = head, head->next = null
,二者顺序不可调换,不然会提前更新1
的后继节点,会错。
代码
/**
* 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 || !head->next) return head;
ListNode *tail = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return tail;
}
};