我很难理解给出下面的解决方案是如何将链表的前半部分连接到后端。我从逻辑上看了一遍,但不能理解最后三行的引用。
给定一个由整数l
和非负整数n
组成的单链表,将最后一个n
链表节点移到链表的开头。
例如输入l = [1, 2, 3, 4, 5]
和n = 3
,则rearrangeLastN(l, n)
的输出应为[3, 4, 5, 1, 2]
.
// Singly-linked lists are already defined with this interface:
// class ListNode<T> {
// ListNode(T x) {
// value = x;
// }
// T value;
// ListNode<T> next;
// }
//
ListNode<Integer> rearrangeLastN(ListNode<Integer> l, int n) {
if (l == null || n == 0) return l;
ListNode<Integer> fast = l; //1,2,3,4,5
ListNode<Integer> slow = l; //1,2,3,4,5
while(n > 0 && fast != null) { //3->2->1
fast = fast.next; //4->5
n--; //1
}
if (n >= 0 && fast == null) return l;
while (fast.next != null) { //1 Interation (4->5->null)
slow = slow.next; //2->3->4->5
fast = fast.next; //5
}
ListNode newHead = slow.next; //3->4->5
slow.next = null;
fast.next = l;
return newHead;
}
最初:
1 -> 2 -> 3 -> 4 -> 5 -> null
^
l
fast
slow
第一个while
循环后:
1 -> 2 -> 3 -> 4 -> 5 -> null
^ ^
l
fast
slow
第二个while
循环后:
1 -> 2 -> 3 -> 4 -> 5 -> null
^ ^ ^
l
fast
slow
ListNode newHead = slow.next;
:
1 -> 2 -> 3 -> 4 -> 5 -> null
^ ^ ^ ^
l
fast
slow newHead
slow.next = null;
:
1 -> 2 -> null 3 -> 4 -> 5 -> null
^ ^ ^ ^
l
fast
slow newHead
fast.next = l;
:
┌────────────────────────────────┐
└> 1 -> 2 -> null 3 -> 4 -> 5 ┘
^ ^ ^ ^
l
fast
slow newHead