重新排列LastN - Java

问题描述

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

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

例如,对于输入 l = [1,2,3,4,5]n = 3rearrangeLastN(l,n)输出应该是 [3,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,5
    ListNode<Integer> slow = l; //1,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