classSolution { public ListNode reverseBetween(ListNode head, int left, int right) { ListNodedummyHead=newListNode(-1, head); ListNodepre= dummyHead; for (inti=0; i < left - 1; i++) { pre = pre.next; }
ListNodesubHead= pre.next; ListNodesubTail= subHead; for (inti=0; i < right - left; i++) { subTail = subTail.next; }
classSolution { public ListNode reverseBetween(ListNode head, int left, int right) { ListNodedummyHead=newListNode(-1, head); ListNodesubHeadPre= dummyHead; for (inti=0; i < left - 1; i++) { subHeadPre = subHeadPre.next; }
ListNodesubHead= subHeadPre.next; ListNodecurr= subHead; ListNodepre=null; for (inti=0; i <= right - left; i++) { // 注意此处的索引,首次处理时 curr.next 会指向空,curr 最后将停留在子链表的后一个节点上 ListNodenext= curr.next; curr.next = pre; pre = curr; curr = next; }
public ListNode reverseTheFirstNNodes(ListNode head, int n, SuccHolder succHolder) { if (n == 1) { succHolder.succ = head.next; return head; }
ListNodenewHead= reverseTheFirstNNodes(head.next, n - 1, succHolder); head.next.next = head; head.next = succHolder.succ; // 虽然中间节点的 next 指向了 succ, 但是会在后续递归回退的过程中被 head.next.next 修正 next 指向 return newHead; }
public ListNode reverseBetween(ListNode head, int left, int right) { ListNodedummyHead=newListNode(-1, head); ListNodeprev= dummyHead; for (inti= left - 1; i > 0; i--) { prev = prev.next; }
prev.next = reverseTheFirstNNodes(prev.next, right - left + 1, newSuccHolder()); return dummyHead.next; } }
public ListNode reverseTheFirstNNodes(ListNode head, int n, SuccHolder succHolder) { if (n == 1) { succHolder.succ = head.next; return head; }
ListNodenewHead= reverseTheFirstNNodes(head.next, n - 1, succHolder); head.next.next = head; head.next = succHolder.succ; // 虽然中间节点的 next 指向了 succ, 但是会在后续递归回退的过程中被 head.next.next 修正 next 指向 return newHead; }
public ListNode reverseBetween(ListNode head, int left, int right) { if (left == 1) { return reverseTheFirstNNodes(head, right - left + 1, newSuccHolder()); }
head.next = reverseBetween(head.next, left - 1, right - 1); return head; } }