0
点赞
收藏
分享

微信扫一扫

LeetCode 206. 反转链表 思考分析

题目
反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

迭代+双指针

从某公众号(代码随想录)搬过来的gif图:看了能很好地理解转置的过程
LeetCode 206. 反转链表 思考分析_空指针

class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre = nullptr;
ListNode* cur = head;
ListNode* tmp;
while(cur != NULL)
{
//临时结点,暂存当前节点的下一个节点,用于后移
tmp = cur->next;
//当前节点指向它前面的节点(完成转置)
cur->next = pre;
//前指针后移
pre = cur;
//当前指针后移
cur = tmp;
}
return pre;
}
};

LeetCode 206. 反转链表 思考分析_链表_02

递归解

递归思路:
LeetCode 206. 反转链表 思考分析_指针_03
递归动态图:
LeetCode 206. 反转链表 思考分析_链表_04
主要思路:
head 的下一个节点指向head
具体实现步骤过程见:
​​​https://leetcode-cn.com/problems/reverse-linked-list/solution/dong-hua-yan-shi-206-fan-zhuan-lian-biao-by-user74/​​

递归模板;

class Solution {
public:
ListNode* reverseList(ListNode* head) {
//终止条件:
//终止条件是当前节点或者下一个节点==null
//终止条件为何是这个?第一个head是null,防止一开始传入的就是空指针
//若一开始传入的就是空指针,则会返回空指针
//若一开始传入的是head+null,则会直接返回head
//若一开始传入的是head+node2+...+null,则正常递归返回
if(head ==NULL || head->next == NULL)
{
return head;
}
//调用递归+逻辑
//在函数内部,改变节点的指向,也就是 head 的下一个节点指向 head 递归函数
ListNode* cur = reverseList(head->next);
head->next->next = head;
//防止链表循环,需要将head.next设置为空,此时原来的head变为尾部
head->next = NULL;
return cur;
}
};

LeetCode 206. 反转链表 思考分析_递归_05


举报

相关推荐

0 条评论