rearrangeLastN - Java



我很难理解给出下面的解决方案是如何将链表的前半部分连接到后端。我从逻辑上看了一遍,但不能理解最后三行的引用。

给定一个由整数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

最新更新