LeetCode 92 区间反转:递归与哨兵节点实战解析
链表反转是数据结构与算法中的经典高频考点。从基础的全链表反转,到反转前 n 个节点,再到进阶的区间反转,层层递进。本文将以 LeetCode 92. 反转链表 II 为核心,从基础的「反转前 n 个节点」递归实现讲起,结合虚拟头节点技巧,拆解区间反转的解题逻辑。
基础筑基:链表【前 n 个节点】递归反转
在解决区间反转之前,我们需要先实现一个核心工具函数:反转链表的前 n 个节点。
1. 函数定义与核心功能
定义递归函数 reverseN,功能如下:
- 函数签名:
ListNode* reverseN(ListNode* head, int n) - 核心功能:反转以 head 为头节点的链表的前 n 个节点,返回反转后的新链表头节点;剩余未反转节点保持原顺序。
2. 递归实现思路拆解
递归的核心是分解子问题、终止条件与回溯调整指针:
- 终止条件:当 n == 1 时,说明已经找到待反转的最后一个节点,直接返回当前节点(新头节点);
- 递归子问题:记录当前节点的下一个节点为 tail,递归调用 reverseN 反转 head.next 开头的 n-1 个节点;
- 回溯调整指针:将当前头节点指向 tail 的后继节点,再将 tail 指向当前头节点,完成局部反转;
- 返回结果:最终返回递归得到的新头节点。
3. 直观调用示例
以链表 1->2->3->4 为例:
| 原链表结构 | 输入参数 n | 反转后链表结构 |
|---|---|---|
| 1->2->3->4 | 2 | 2->1->3->4 |
| 1->2->3->4 | 3 | 3->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* {
(n == ) {
head;
}
ListNode* tail = head->next;
ListNode* newHead = (head->next, n - );
head->next = tail->next;
tail->next = head;
newHead;
}


