LeetCode 92 链表区间反转:递归实现与哨兵技巧详解
链表反转是数据结构与算法中的经典高频考点,从基础的全链表反转,到反转前 n 个节点,再到进阶的区间反转,层层递进。本文将以 LeetCode 92. 反转链表 II 为核心,从基础的「反转前 n 个节点」递归实现讲起,结合虚拟头节点神器,手把手拆解区间反转的解题逻辑。
开篇引论:链表反转的进阶之路
链表是一种线性、离散存储的数据结构,节点之间通过指针关联,无法像数组一样随机访问,这也让链表反转成为了考察指针操作与递归思维的最佳题型。
LeetCode 92 区间反转问题,并非孤立的算法题,而是「反转前 n 个节点」的进阶应用。我们的解题思路非常清晰:先攻克基础的前 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( x, ListNode *next) : (x), (next) {}
};
{
(n == ) {
head;
}
ListNode* tail = head->next;
ListNode* newHead = (head->next, n - );
head->next = tail->next;
tail->next = head;
newHead;
}


