257 字
1 分钟
快慢指针寻找中间节点算法笔记

在链表问题中,经常需要找到链表的 中间节点。 最常见的方法是 快慢指针

核心思想:

  • slow 每次走 1步
  • fast 每次走 2步

fast 走到链表末尾时:

slow 正好在中间

一、基本原理#

初始化两个指针:

slow = head
fast = head

循环移动:

while fast and fast.next:
slow = slow.next
fast = fast.next.next

最终:

slow 指向链表中间节点

二、图示理解(奇数链表)#

链表:

1 → 2 → 3 → 4 → 5

初始状态:

slow
1 → 2 → 3 → 4 → 5
fast

第一轮移动:

slow
1 → 2 → 3 → 4 → 5
fast

第二轮移动:

slow
1 → 2 → 3 → 4 → 5
fast

结束:

slow
1 → 2 → 3 → 4 → 5
fast → None

最终:

slow = 3

中间节点是 3


三、代码模板#

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

复杂度:

时间复杂度:O(n)
空间复杂度:O(1)

四、偶数链表情况#

链表:

1 → 2 → 3 → 4

移动过程:

初始:

slow
1 → 2 → 3 → 4
fast

第一轮:

slow
1 → 2 → 3 → 4
fast

第二轮:

slow
1 → 2 → 3 → 4
fast → None

最终:

slow = 3

返回 右中点


五、典型应用场景#

快慢指针是链表题的 核心技巧,常用于:

1 回文链表#

1 → 2 → 3 → 2 → 1
中点

步骤:

1 找中点
2 反转后半链表
3 比较

2 归并排序链表#

1 → 4 → 3 → 2 → 5

拆成:

1 → 4 → 3
2 → 5

3 判断链表是否有环#

Floyd 判环算法:

slow 每次1步
fast 每次2步

如果:

slow == fast

说明链表有环。


六、核心总结#

快慢指针的本质:

fast 速度 = slow × 2

当:

fast 到达终点

则:

slow 位于中点
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

快慢指针寻找中间节点算法笔记
http://wangxvvv.top/posts/快慢指针/
作者
王诩
发布于
2024-06-23
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时