1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
class Solution
{
public:
ListNode* reverseBetween(ListNode* head, int left, int right)
{
ListNode* dummy = new ListNode(-1); // 创建虚拟头节点,简化边界处理
dummy->next = head;
ListNode* p = dummy;
// 将 p 移动到 left 前一个节点的位置
for (int i = 0; i < left - 1; ++ i)
p = p->next;
// 初始化要反转的部分的起始节点
ListNode *prev = p->next, *cur = prev->next;
// 头插法反转 [left, right] 区间
for (int i = 0; i < right - left; ++ i)
{
ListNode *next = cur->next; // 暂存下一个节点
cur->next = prev; // 当前节点指向前一个节点
prev = cur, cur = next; // 向前推进指针
}
// 拼接反转后的子链表与剩余链表
ListNode *q = p->next; // 反转前的 left 节点,反转后变成尾部
p->next = prev; // p 指向反转后的头部
q->next = cur; // 原 left 节点指向反转后剩余的部分
return dummy->next; // 返回新链表头节点
}
};
|