链接列表的中间

Middle of the Linked List

在下面的代码中,当使用两个指针技术时,令人困惑的是我们为什么使用 slow.next 和 fast.next.next。比如在链表[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]中,如果我们在最后一个位置'10'(快指针),那么慢指针应该在'8' 位置。有人可以澄清一下吗?

def middleNode(self, head):
        slow = fast = head 
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
            
        return slow

简而言之: fastslow 双倍 速度移动。它们的距离在每次迭代时增加一。这不同于以相同的速度移动但开始不同的位置(比如一个从 0 开始,另一个从 2 开始)。

更详细的解释:

fast指针的移动速度是慢指针的两倍,这就是为什么当fast指针到达链表末尾时,slow指针在中间。这就是fast指针移动fast.next.next的原因。这意味着 fast 在每次迭代中跳过一个并跳转 2 个字段,而 slow 指针只移动一个。这也是你在 while 循环条件中检查 fast and fast.next 以确保 next 指针不是 None 的原因,因为你想调用 next它。

让我们举一个比您提供的更小的例子来简化说明:

[1,2,3,4,5]

# before entering the while loop:
# head is at position 1
# fast and slow both are at position 1

# first iteration
[1,2,3,4,5]
 f
 s
fast == 1 and fast.next == 2
slow == 1
fast jumps 2 nodes and becomes 3 (fast.next.next)
slow jumps 1 node and becomes 2 (slow.next)

# second iteration
[1,2,3,4,5]
     f
   s
fast == 3 and fast.next == 4
slow == 2
fast jumps 2 nodes and becomes 5 (fast.next.next)
slow jumps 1 node and becomes 3 (slow.next)

# third iteration (doesn't enter the loop, see why)
[1,2,3,4,5]
         f
     s
fast == 5 and fast.next == None (tail of linked list)
slow == 3
# while loop breaks
# we return slow which lies in the middle of the linked list