思路:
引入三指针,将要反转的节点用头插法插入left前驱的后继就可以反转。
动图解析:
【注】动图之中left =2,right=4不会改变。图中有异为制作失误。
public ListNode reverseBetween(ListNode head, int left, int right) {
//只有一个有效节点时
if (head.next == null) {
return head;
}
//至少两个有效节点
ListNode dummyHead = new ListNode();
dummyHead.next = head;
ListNode prev = dummyHead;
ListNode cur = head;
for (int i = 0; i < left - 1; i++) {
prev = prev.next;//走到翻转节点前驱
cur = cur.next;//走到带翻转节点
}
for (int i = left; i < right; i++) {
ListNode next = cur.next;
cur.next = next.next;
//头插相当于翻转
next.next = prev.next;
prev.next = next;
}
return dummyHead.next;
}