重新排列最后一个 N - Java

rearrangeLastN - Java

鉴于以下解决方案,我很难理解链表的前半部分是如何连接到后端的。我从逻辑上 运行 通读了它,但无法理解最后 3 行的引用。

给定一个整数单链表l和一个非负整数n,将最后一个n列表节点移动到链表的开头。

例如,对于输入 l = [1, 2, 3, 4, 5]n = 3rearrangeLastN(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