前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【递归】反转链表,你掌握了吗?

【递归】反转链表,你掌握了吗?

作者头像
利刃大大
发布于 2025-05-22 05:34:10
发布于 2025-05-22 05:34:10
5900
代码可运行
举报
文章被收录于专栏:csdn文章搬运csdn文章搬运
运行总次数:0
代码可运行
206. 反转链表

206. 反转链表

​ 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

img
img
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

img
img
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:head = [1,2]
输出:[2,1]

示例 3:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:head = []
输出:[]

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

进阶: 链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?


解题思路:递归

​ 对于链表,其实用迭代的方式是比较好理解的,因为把它抽象成一棵二叉树,其实就是一个单分支的二叉树,所以用迭代反而会更好理解,但是为了学习递归,我们要使用递归的思想来解决这道题,其实也不是很难,就是一个逆序的时机问题!

​ 递归问题,我们要用宏观的角度去看待,只要发现了重复的子问题,我们就把其中的一个子问题拎出来处理,然后交给其它子问题去解决即可,就像这道题的例一,我们要对整个链表进行逆序,如果我们针对前两个节点单独来说的话,将节点二直接指向节点一的话,那么节点三就丢失了,所以我们要换个思路,就是递归的思路,在处理前两个节点之前,应该先保证后面的节点已经处理完逆序了,此时就只需要关心当前的两个节点即可,如下图所示:

​ 可以看到,按照上面的操作次序来看,这就是一个 后序遍历,先递归处理后面的节点,再返回来完成当前节点的操作!

​ 只不过要注意一个细节,就是题目要返回的是逆序后新的头节点也就是节点五,如果我们在递归函数中返回当前节点,那最后得到的还是上图中的节点一,所以我们需要 在后序遍历到空节点的时候,也就是在递归函数的出口记录下节点五,然后进行返回,经过一层一层的返回之后,最后在原先调用递归函数的入口处就拿到了新节点,进行返回即可!

​ 此外,因为最后我们要让原来的头节点指向空,那么递归函数中就需要有一个操作是把 cur->next 指向空的,这对深层的其它节点其实是没有影响的,因为中间的某些节点在操作的时候虽然也是直接 cur->next = nullptr,但是操作完之后返回到上一层之后,进行操作是 cur->next->next 指向 cur,此时 cur->next->next 为空的话是没问题的!

​ 所以可以统一第三步操作为 cur->next = nullptr

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        // 递归函数出口
        if(head == nullptr || head->next == nullptr)
            return head;
        
        // 进行后序遍历,因为操作当前节点前要保证后面已经处理完毕。
        // 还要将返回的节点记录下来,这个节点是新的头节点
        ListNode* newhead = reverseList(head->next);

        // 操作当前节点
        head->next->next = head;
        head->next = nullptr;

        // 最后返回记录的新头节点
        return newhead;
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验