快慢指针在链表中的应用

快慢指针寻找链表中间值

快慢指针指的是定义两个指针,这两个指针的移动速度一快一慢,以此来制造出自己想要的差值,这个差值可以让
我们找到链表上相应的结点。一般情况下,快指针的移动步长为慢指针的两倍

利用快慢指针,我们把一个链表看成一个跑道,假设a的速度是b的两倍,那么当a跑完全程后,b刚好跑一半,以
此来达到找到中间节点的目的。
如下图,最开始,slow与fast指针都指向链表第一个节点,然后slow每次移动一个指针,fast每次移动两个指针。

image-20210112093346730

快慢指针判断链表是否有环

image-20210112093422450

使用快慢指针的思想,还是把链表比作一条跑道,链表中有环,那么这条跑道就是一条圆环跑道,在一条圆环跑道
中,两个人有速度差,那么迟早两个人会相遇,只要相遇那么就说明有环。

image-20210112093504365

image-20210112093545889

快慢指针寻找有环链表环的入口

当快慢指针相遇时,我们可以判断到链表中有环,这时重新设定一个新指针指向链表的起点,且步长与慢指针一样
为1,则慢指针与“新”指针相遇的地方就是环的入口。

image-20210112093933436

image-20210112093838752

由上推导可知,当快慢指针相遇后,定义一个新指针,与慢指针速度相同,则新指针与慢指针将会在入口处相遇。

快慢指针计算有环链表环的大小

在证明链表是否有环的过程中,快慢指针第一次相遇。此后,快指针继续按一次两步的速度走,慢指针按一次一步的速度走,并设置一个计数器count = 0,每走一次加1,。当快慢指针再次相遇时,快指针刚好比慢指针多走了R步,而计数器count == C。

以奇数个数节点的的环为例

image-20210112095211443

恰好在慢指针走完一圈后相遇,1-->2, 2-->3…… 7-->1

此时count=7=C

以偶数个数节点的环为例

image-20210112095439162

同样,恰好在慢指针走完一圈后相遇,1-->2, 2-->3…… 8-->1

此时count=8=C

posted @ 2021-01-15 16:27  ThirteenZhang  阅读(177)  评论(0)    收藏  举报