链表进阶核心 | LeetCode 92 区间反转:吃透递归反转与哨兵技巧

链表进阶核心 | LeetCode 92 区间反转:吃透递归反转与哨兵技巧

✨链表进阶核心 | LeetCode 92 区间反转:吃透递归反转与哨兵技巧🎯

视频地址

因为想更好的为大佬服务,制作了同步视频,这是Bilibili的视频地址

链表反转是数据结构与算法中的经典高频考点,从基础的全链表反转,到反转前n个节点,再到进阶的区间反转,层层递进。本文将以LeetCode 92. 反转链表 II为核心,从基础的「反转前n个节点」递归实现讲起,结合虚拟头节点神器,手把手拆解区间反转的解题逻辑,带你彻底掌握链表递归反转的核心思想!


🚀 开篇引论:链表反转的进阶之路

链表是一种线性、离散存储的数据结构,节点之间通过指针关联,无法像数组一样随机访问,这也让链表反转成为了考察指针操作与递归思维的最佳题型。

LeetCode 92 区间反转问题,并非孤立的算法题,而是**「反转前n个节点」**的进阶应用。我们的解题思路非常清晰:先攻克基础的前n节点反转,再将区间反转问题拆解为基础问题的组合,化繁为简,轻松破解难题。


🔄 基础筑基:链表【前n个节点】递归反转

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

1. 函数定义与核心功能

我们定义递归函数 reverseN,功能如下:

  • 函数签名ListNode* reverseN(ListNode* head, int n)
  • 核心功能:反转以head为头节点的链表的前n个节点,返回反转后的新链表头节点;剩余未反转节点保持原顺序。

2. 递归实现思路拆解

递归的核心是分解子问题 + 终止条件 + 回溯调整指针,严格遵循以下逻辑:

  1. 终止条件:当n == 1时,说明已经找到待反转的最后一个节点,直接返回当前节点(新头节点);
  2. 递归子问题:记录当前节点的下一个节点为tail,递归调用reverseN反转head.next开头的n-1个节点;
  3. 回溯调整指针:将当前头节点指向tail的后继节点,再将tail指向当前头节点,完成局部反转;
  4. 返回结果:最终返回递归得到的新头节点。

3. 直观调用示例

我们以链表 1->2->3->4 为例,通过表格直观展示函数效果:

原链表结构输入参数n反转后链表结构
1->2->3->422->1->3->4
1->2->3->433->2->1->4

4. 关键代码实现(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; // 递归反转:反转head.next的前n-1个节点,得到新头节点 ListNode* newHead = reverseN(head->next, n - 1); // 指针调整:当前头节点指向tail的后继节点 head->next = tail->next; // tail指向当前头节点,完成局部反转 tail->next = head; // 返回反转后的新头节点 return newHead; } 

代码关键解析

  • tail 保存了当前节点的直接后继,是回溯时调整指针的核心;
  • 递归会一直深入到待反转的最后一个节点,回溯时从后往前调整指针,完美实现反转;
  • 未反转的节点完全不影响,保证了链表的完整性。

🎯 实战攻坚:LeetCode 92 链表区间反转

1. 题目问题描述

LeetCode 92. 反转链表 II

给你单链表的头指针 head 和两个整数 mn1 ≤ m ≤ n ≤ 链表长度),请你反转从位置 m 到位置 n 的链表节点,返回反转后的链表。

2. 神器加持:虚拟头节点(哨兵)技巧

这是链表题中解决边界问题的万能技巧

  • 定义:创建一个额外的链表节点(值任意,如0),让它的next指向原链表的头节点,这个节点就是虚拟头节点(dummy)
  • 核心作用:消除「待反转区间包含原链表头节点」的特殊情况,统一所有操作逻辑,类似哨兵节点的防护作用。

我们用Mermaid图直观展示虚拟头节点的结构:

next

移动m-1步

m=2

虚拟头节点 dummy\nval=0

节点1

节点2

节点3

null

指针p

指针p

📌 图表说明:虚拟头节点独立于原链表,指针p只需移动m-1步,就能精准定位到待反转区间的前驱节点,无论m=1还是m>1,逻辑完全一致。

3. 整体解题思路

将区间反转问题拆解为3个简单步骤,完美复用我们的reverseN函数:

  1. 定位前驱节点:通过虚拟头节点,移动指针找到第m-1个节点(记为p),它是待反转区间的前一个节点;
  2. 计算反转长度:待反转节点数 k = n - m + 1
  3. 调用工具函数+拼接:调用reverseN反转p.next开头的k个节点,将p.next指向反转后的新头节点,完成拼接。

4. 完整代码实现(C++)与逐行解析

 // LeetCode92 区间反转主函数 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个节点 p->next = reverseN(p->next, k); // 6. 返回虚拟头节点的next(最终链表头) return dummy->next; } 

代码关键解析

  • 虚拟头节点彻底规避了m=1时头节点变化的边界问题;
  • 仅通过一次循环定位前驱节点,时间复杂度极低;
  • 核心反转逻辑完全复用reverseN,代码复用性拉满。

5. 算法复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n) ,仅遍历链表一次,递归操作也是线性的;
  • 空间复杂度: O ( n ) O(n) O(n) ,递归调用会占用栈空间(若改用迭代实现reverseN,空间可优化为 O ( 1 ) O(1) O(1) )。

📚 算法原理深度剖析

1. 递归反转的核心原理

链表递归反转的本质是后序遍历:先递归深入到子问题的终止节点,再回溯调整指针。

对于reverseN,我们把「反转前n个节点」分解为「反转前n-1个节点」的子问题,直到n=1到达终点,再逐层回溯调整指针,最终完成整体反转。

2. 虚拟头节点的底层逻辑

普通链表操作中,头节点没有前驱,当反转区间包含头节点时,需要单独写判断逻辑。虚拟头节点为原链表增加了一个「公共前驱」,让所有节点的操作逻辑完全统一,代码更简洁、更健壮。


💡 算法学习核心建议

结合本题的学习,给大家分享算法刷题的核心方法论:

  1. 思维与代码双管齐下:学习算法分为学思路写代码两个过程,缺一不可。先理解递归分解、区间拆解的思维逻辑,再动手敲代码,才能真正内化;
  2. 基础工具优先掌握:复杂算法题都是基础工具的组合,比如本题的reverseN就是核心工具,吃透基础,进阶题迎刃而解;
  3. 实操大于空想:不要只看题解,跟着思路逐行敲代码,调试指针操作,才能攻克链表的指针难点;
  4. 刻意练习边界情况:链表题的坑点都在边界(如m=1、n=链表长度),刻意针对边界测试,提升代码健壮性。

结语

LeetCode 92 区间反转,是链表递归反转的里程碑式题目。它教会我们:复杂问题拆解为基础子问题,用工具函数简化核心逻辑,用技巧规避边界问题

从反转前n个节点,到区间反转,不仅是代码的进阶,更是递归思维的升华。希望大家通过本文,彻底吃透链表反转的核心,在算法刷题的路上稳步前行!💪


✅ 关键点回顾

  1. 核心工具:reverseN递归反转链表前n个节点;
  2. 万能技巧:虚拟头节点统一链表边界操作;
  3. 解题核心:区间反转 = 定位前驱 + 调用基础反转函数 + 拼接链表;
  4. 学习方法:思路先行,代码跟进,刻意练习!
链表进阶核心 | LeetCode 92 区间反转:吃透递归反转与哨兵技巧

Read more

Flutter 三方库 dns_client 的鸿蒙化适配指南 - 告别 DNS 劫持、探索 DNS-over-HTTPS (DoH) 技术、构建安全的鸿蒙网络请求环境

Flutter 三方库 dns_client 的鸿蒙化适配指南 - 告别 DNS 劫持、探索 DNS-over-HTTPS (DoH) 技术、构建安全的鸿蒙网络请求环境

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 dns_client 的鸿蒙化适配指南 - 告别 DNS 劫持、探索 DNS-over-HTTPS (DoH) 技术、构建安全的鸿蒙网络请求环境 在移动互联网时代,DNS 劫持和隐私泄露是网络请求中的“两大顽疾”。当你为鸿蒙系统开发高性能的金融、通讯或工具类应用时,如何确保你的域名解析既快又安全?今天我们来聊聊 dns_client 这个能让你的 Flutter 应用直接对话全球顶级 DNS 服务的利器。 前言 传统的 DNS 查询基于 UDP,既不加密也容易被篡改。而 dns_client 通过 DNS-over-HTTPS (DoH) 技术,将 DNS 查询请求封装在加密的

By Ne0inhk
Flutter 组件 fluid_layout 的适配 鸿蒙Harmony 实战 - 驾驭全场景动态自适应栅格、实现鸿蒙端弹性布局分发与多端显示适配方案

Flutter 组件 fluid_layout 的适配 鸿蒙Harmony 实战 - 驾驭全场景动态自适应栅格、实现鸿蒙端弹性布局分发与多端显示适配方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 fluid_layout 的适配 鸿蒙Harmony 实战 - 驾驭全场景动态自适应栅格、实现鸿蒙端弹性布局分发与多端显示适配方案 前言 在鸿蒙(OpenHarmony)生态的“一次开发、多端部署”战略中,面对需要在华为手机、MatePad、智慧屏、甚至车载大屏等不同分辨率、不同宽纵比的设备间无缝流转的 UI 设计。如果仅仅依靠写死的 double 宽度或者是简单的 MediaQuery.of(context).size。那么不仅会导致在折叠屏(Foldable)展开瞬间产生严重的界面坍塌,更会因为缺乏一套工业级的栅格(Grid)规范。引发在不同 DPI 下文字重叠、按钮溢出以及留白失控等严重的适配事故方案。 我们需要一种“流动感知、栅格克制”的布局艺术。

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 ulid 别再用杂乱的 UUID,为鸿蒙应用换上“可排序、更简洁”的唯一标识符(全局 ID 新标准)

Flutter for OpenHarmony: Flutter 三方库 ulid 别再用杂乱的 UUID,为鸿蒙应用换上“可排序、更简洁”的唯一标识符(全局 ID 新标准)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 的分布式数据库设计、日志系统或任务追踪系统开发时,我们需要为每一条记录生成一个“全局唯一标识符”。 1. 传统 UUID 的痛点:UUID (v4) 是完全随机的,它破坏了数据库的 B-Tree 索引顺序,导致写入性能下降;且 36 位连字符字符串在数据库中显得过于臃肿。 2. ULID 的优势:它兼具了 128 位的全局唯一性,同时它的前 48 位是时间戳。这意味着 ULID 天然可按时间排序。 ulid 软件包为鸿蒙开发者提供了这种现代化的 ID 生成方案。它采用 Base32 编码(26 个字符),没有特殊符号,既美观又极具工程性能优势。 一、

By Ne0inhk
第二章-AIGC入门-AIGC工具全解析:技术控的效率神器,DeepSeek国产大模型的骄傲(8/36)

第二章-AIGC入门-AIGC工具全解析:技术控的效率神器,DeepSeek国产大模型的骄傲(8/36)

一、引言:AIGC 时代的浪潮 在数字化时代的浪潮中,人工智能生成内容(AIGC)技术正以迅猛之势席卷而来,深刻地改变着我们的生活和工作方式。从日常的社交媒体互动,到专业的内容创作、设计、教育、医疗等领域,AIGC 工具无处不在,展现出强大的影响力和无限的潜力。 AIGC 技术的核心在于利用人工智能算法,通过对海量数据的学习和分析,自动生成各种形式的内容,包括文本、图像、音频、视频等 。这一技术的突破,打破了传统内容创作的边界,使得内容生产变得更加高效、智能和多样化。无论是创作一篇新闻报道、设计一幅精美的海报,还是制作一段引人入胜的视频,AIGC 工具都能提供有力的支持,帮助创作者节省时间和精力,激发更多的创意灵感。 如今,AIGC 工具已经广泛应用于各个行业。在新闻媒体领域,自动化新闻写作工具能够快速生成体育赛事、财经新闻等报道,大大提高了新闻的时效性;在广告营销行业,AIGC 可以根据产品特点和目标受众,生成极具吸引力的广告文案和创意设计,提升营销效果;在影视游戏制作中,AIGC

By Ne0inhk