赞
踩
快慢指针是一种常用的指针技巧,常用于解决链表相关问题。
快指针(fast pointer)和慢指针(slow pointer)同时从起点出发,但步长不同。快指针每次移动两个节点,慢指针每次移动一个节点。通过不同的移动速度,可以实现对链表的不同遍历方式。
快慢指针常见的应用场景有三种:
判断链表是否有环:
快指针每次移动两个节点,慢指针每次移动一个节点。如果链表没有环,快指针最终会到达链表的末尾,而慢指针会到达中间位置。如果链表有环,快指针和慢指针最终会相遇。
寻找链表的中间节点:
快指针每次移动两个节点,慢指针每次移动一个节点。当快指针到达链表末尾时,慢指针正好到达链表的中间位置。
判断链表的长度是否满足某个条件:
快指针和慢指针同时从链表头部出发,根据条件不同,快指针可能在达到链表尾部之前到达某个位置,然后可以根据快指针和慢指针的位置判断链表长度是否满足条件。
演示动画
参考演示代码:
当slow指针和fast指针进入链表的环状部分时,假设slow和fast相距N,fast每次比slow多走一步,因此此问题便转变为数学的追及问题。
然而当fast指针一次走三步,四步,五步还能否与slow相遇?
以三步为例不难发现如果N是偶数,只要次数够多N-2终究会变成0,因此fast还是会与slow相遇,但当N为基数时,N-2=-1说明fast超过slow一步准备开始第二轮追击,假设圆的周长为C,当C-1为偶数时,fast最终还是会和slow相遇。因此得出结论当N为基数且C为偶数时不可能相遇。
这可能并不严谨,因此我们需要从数学的角度深刻探究此问题。
假设slow指针走的路程是:L
环状带比较小时,在slow指针还未进入环状带fast指针可能已经在环状带走动了好几圈,我们假设圈数为:X
当slow指针准备进入环状带时fast比slow多走:C-N
因此fast指针走的路程为:L+X*C+C-N
而fast指针的速度是slow指针的三倍
得出等式:L+X*C+C-N=3L
化简:2L=(X-1)*C-N
得出结论C和N不可能一基一偶
所以当fast指针一次走三步也终将和slow相遇(你认为她不属于你,但可能只是时候未到)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。