92. 反转链表 II
给你单链表的头节点 head
和两个整数 left
和 right
,其中 left <= right
。请你反转从位置 left
到位置 right
的链表节点,返回 反转后的链表 。
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1
输出:[5]
提示:
- 链表中节点数目为
n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
进阶: 你可以使用一趟扫描完成反转吗?
方法一:一趟扫描
解题思路
- 第一步,找到
left
的位置。 - 第二步,反转
[left, right]
区间。 - 细节参考代码。
参考代码
public ListNode reverseBetween(ListNode head, int left, int right) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode pre = dummy, curr = head;
int idx = 1;
while(curr != null) {
if (idx == left) {
while (idx < right) {
ListNode next = curr.next;
curr.next = next.next;
next.next = pre.next;
pre.next = next;
idx++;
}
break;
}
pre = curr;
curr = curr.next;
idx++;
}
return dummy.next;
}