链接列表的中间
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
简而言之: fast
以 slow
的 双倍 速度移动。它们的距离在每次迭代时增加一。这不同于以相同的速度移动但开始不同的位置(比如一个从 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
在下面的代码中,当使用两个指针技术时,令人困惑的是我们为什么使用 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
简而言之: fast
以 slow
的 双倍 速度移动。它们的距离在每次迭代时增加一。这不同于以相同的速度移动但开始不同的位置(比如一个从 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