跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

LeetCode 92 链表区间反转:递归与哨兵节点实战

综述由AI生成链表区间反转是考察指针操作与递归思维的典型题目。通过实现反转前 n 个节点的递归工具函数,结合虚拟头节点技巧统一边界逻辑,可高效解决 LeetCode 92 问题。该方法避免了针对 m=1 的特殊判断,将区间反转拆解为定位前驱、调用基础反转及拼接三个步骤,时间复杂度 O(n),空间复杂度 O(n)。掌握此模式有助于应对各类链表变形题。

leon发布于 2026/3/23更新于 2026/5/28 浏览
LeetCode 92 链表区间反转:递归与哨兵节点实战

链表区间反转实战

链表操作最考验指针手感,也是数据结构面试中的高频考点。从基础的全链表反转,到进阶的区间反转,层层递进。本文以 LeetCode 92 为例,拆解如何用最基础的递归工具解决复杂的区间问题。

基础:反转前 n 个节点

在攻克区间反转之前,我们先实现一个核心工具函数:反转链表的前 n 个节点。这是解题的基石。

1. 函数定义与逻辑

我们需要一个递归函数 reverseN,它接收头节点和整数 n,返回反转后的新头节点。剩余未反转的节点保持原顺序。

递归的核心在于分解子问题 + 终止条件 + 回溯调整指针:

  1. 终止条件:当 n == 1 时,说明已经到达待反转区间的最后一个节点,直接返回当前节点;
  2. 递归调用:记录当前节点的下一个节点为 tail,递归处理 head.next 开头的 n-1 个节点;
  3. 回溯调整:递归返回后,将当前头节点指向 tail 的后继,再将 tail 指向当前头节点,完成局部反转。

这里有个细节要注意:tail 保存了当前节点的直接后继,它是回溯时连接后续链表的桥梁。如果没存好,后面的节点就断开了。

2. 代码实现(C++)
// 链表节点定义
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) {}
};

// 核心函数:反转链表前 n 个节点(递归实现)
ListNode* reverseN(ListNode* head, int n) {
    // 终止条件:n=1,到达待反转的最后一个节点
    if (n == 1) {
        return head;
    }
    
    // 记录当前节点的下一个节点(待反转的子链表头)
    ListNode* tail = head->next;
    
    
    ListNode* newHead = (head->next, n - );
    
    
    head->next = tail->next;
    
    tail->next = head;
    
    
     newHead;
}
// 递归反转:反转 head.next 的前 n-1 个节点
reverseN
1
// 指针调整:当前头节点指向 tail 的后继节点
// tail 指向当前头节点,完成局部反转
// 返回反转后的新头节点
return

这段代码里,newHead 是最终整个反转段的新头,而 head 变成了反转段的尾。理解这个指针流向,递归就不难了。

实战:LeetCode 92 区间反转

题目要求反转从位置 m 到位置 n 的节点。这其实就是把刚才的工具函数复用起来,但多了个边界处理的坑。

1. 难点:边界情况

如果 m = 1,意味着要反转的部分包含原链表的头节点。这时候头节点会变,返回值不再是原来的 head。如果每次都要单独判断 m=1,代码会显得臃肿且容易出错。

2. 神器:虚拟头节点(哨兵)

解决这个问题的万能技巧是引入虚拟头节点(dummy)。创建一个额外节点,让它的 next 指向原链表头。这样无论 m 是多少,待反转区间的前驱节点永远存在,逻辑完全统一。

想象一下,指针 p 从 dummy 开始移动 m-1 步,就能精准定位到待反转区间的前一个节点。不需要关心 m 是不是 1,因为 dummy 永远在那里。

3. 完整解题思路
  1. 创建哨兵:dummy->next = head。
  2. 定位前驱:移动指针找到第 m-1 个节点,记为 p。
  3. 计算长度:需要反转的节点数 k = n - m + 1。
  4. 调用工具:调用 reverseN(p.next, k),并将结果接回 p。
  5. 返回结果:返回 dummy->next。
4. 代码实现(C++)
ListNode* reverseBetween(ListNode* head, int m, int n) {
    // 1. 创建虚拟头节点,指向原链表头
    ListNode* dummy = new ListNode(0);
    dummy->next = head;
    
    // 2. 定义指针 p,初始指向虚拟头节点
    ListNode* p = dummy;
    
    // 3. 移动 m-1 步,定位到待反转区间的前驱节点
    for (int i = 0; i < m - 1; i++) {
        p = p->next;
    }
    
    // 4. 计算需要反转的节点个数
    int k = n - m + 1;
    
    // 5. 调用 reverseN,反转 p.next 开头的 k 个节点
    // 注意:reverseN 会修改 p.next 指向新的头,并更新内部指针
    p->next = reverseN(p->next, k);
    
    // 6. 返回虚拟头节点的 next(最终链表头)
    return dummy->next;
}

这里有个小陷阱:reverseN 内部修改了指针,所以 p->next 必须重新赋值,否则链表会在 p 处断开。实际调试时多画几次图,指针关系就清晰了。

复杂度分析

  • 时间复杂度:O(n)。我们只遍历了一次链表,递归深度也是线性的。
  • 空间复杂度:O(n)。主要是递归调用栈占用的空间。如果改用迭代实现 reverseN,空间可以优化到 O(1),但递归写法更直观,适合理解原理。

总结

LeetCode 92 是链表递归反转的里程碑式题目。它教会我们两个核心点:

  1. 复杂问题拆解:区间反转本质就是'定位 + 基础反转 + 拼接'。不要试图一次性写出所有逻辑,先写好 reverseN 这个小工具。
  2. 边界处理技巧:虚拟头节点能消除大部分特殊情况的判断,让代码更健壮。

刷题时别光看题解,跟着思路逐行敲代码,调试指针操作,才能真正攻克链表的难点。

目录

  1. 链表区间反转实战
  2. 基础:反转前 n 个节点
  3. 1. 函数定义与逻辑
  4. 2. 代码实现(C++)
  5. 实战:LeetCode 92 区间反转
  6. 1. 难点:边界情况
  7. 2. 神器:虚拟头节点(哨兵)
  8. 3. 完整解题思路
  9. 4. 代码实现(C++)
  10. 复杂度分析
  11. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • iOS 项目 Jenkins 持续集成环境搭建与常见问题排查
  • 滑动窗口实战:长度最小的子数组与无重复字符的最长子串
  • Llama-3.2-3B 在 Ollama 下的中文法律理解与类案推荐表现
  • LLM 解码方式详解:贪心、束搜索与采样策略
  • IntelliJ IDEA 常用快捷键指南
  • 智能家居视觉升级:集成通用模型实现物品自动识别
  • MySQL 9.0 安装配置与多语言连接教程
  • 基于 AI 辅助开发的在线图书借阅平台设计与实现
  • DeepSeek 使用指南:提示词技巧与本地知识库搭建
  • LLM 提示工程技巧总结:从 Zero-Shot 到 Chain-of-Thought
  • 造相-Z-Image本地AI绘画:RTX 4090写实图像生成实践
  • Python 主流开发框架分类与选型指南
  • Flutter for OpenHarmony 实战:通义万相 AIGC 联调与相册持久化
  • WSL 中 VS Code Remote 连接 GitHub Copilot 代理配置问题
  • DeepSeek 使用指南与高阶提示词技巧
  • Stable Diffusion 3.5 FP8 在博物馆展览视觉设计中的应用
  • Linux 部署 OpenClaw 指南
  • Ubuntu 下 AMD AI MAX 395+ 使用 ROCm 加速部署千问 Qwen 模型
  • OpenClaw Windows 部署:Node.js 22+Git+Kimi+ 飞书
  • AVL 树的平衡艺术:用 C++ 实现自平衡二叉搜索树

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online