开篇引论
链表是一种线性、离散存储的数据结构,节点之间通过指针关联,无法像数组一样随机访问。这也让链表反转成为了考察指针操作与递归思维的最佳题型。
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) {}
( x, ListNode *next) : (x), (next) {}
};
{
(n == ) {
head;
}
ListNode* tail = head->next;
ListNode* newHead = (head->next, n - );
head->next = tail->next;
tail->next = head;
newHead;
}


