92.反转链表2

给你单链表的头指针 head 和两个整数 leftright ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表

示例 1:

img

1
2
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

示例 2:

1
2
输入:head = [5], left = 1, right = 1
输出:[5]

Solution

轴是第2个结点,直接指向了第4个结点

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
// 定义一个解决方案类
class Solution {
// 定义函数 reverseBetween,接收头节点 head 和两个整型参数 left 和 right
public ListNode reverseBetween(ListNode head, int left, int right) {
// 创建一个哑节点 dummyNode,哑节点通常用于简化链表操作,这里值设为-1不影响链表
ListNode dummyNode = new ListNode(-1);
// 将哑节点的下一个节点指向头节点,这样便于操作头部节点
dummyNode.next = head;
// 定义一个指针 pre,初始化指向 dummyNode,用于定位 left 的前一个位置
ListNode pre = dummyNode;
// 通过循环,将 pre 移动到 left 的前一个位置
for (int i = 0; i < left - 1; i++) {
pre = pre.next;
}
// 定义 cur 指针,指向要开始反转的第一个节点
ListNode cur = pre.next;
// 定义 next 指针,用于临时存储 cur 的下一个节点,便于调整链接
ListNode next;
// 进行 right-left 次操作以实现局部链表的反转
for (int i = 0; i < right - left; i++) {
next = cur.next; // next 指向 cur 的下一个节点
cur.next = next.next; // cur 的下一个指向 next 的下一个节点,断开 cur 与 next 的直接联系
next.next = pre.next; // next 的下一个节点指向 pre 的下一个节点,实现节点插入
pre.next = next; // pre 的下一个节点指向 next,完成一次节点提前的过程
}
// 最后返回新的头节点,由于可能改变了头节点,所以需要从 dummyNode 的下一个节点返回
return dummyNode.next;
}
}