快慢指针思想

242 阅读2分钟

1.什么是快慢指针?

快慢指针是指在一个链路中,有两个指针,快指针一次走两步,慢指针一次走一步.通过这两个指针的位置变化,能够衍生出几个比较重要的论证:

a.中值寻找

b.奇偶判定

c.环路判定

d.倒数k位置判定

2.中值寻找和奇偶判定

如果慢指针每次走一步,而快指针每次走两步.则如果当快指针走到第0x0004节点时,慢指针则到第0x0002节点上,此时的位置刚刚好快指针所走过的路径的一半位置,即:

sp=1, fp=2
sp=2, fp=4
sp=3, fp=6

如果第6个节点fp6.next=NULL,则说明这条链路有偶数个节点,如果fp6.next.next=NULL,则说明此链路是基数个节点

3.环路判定

定理:如果一条链路存在环路,则快慢节点一定会相遇

原理:在快慢指针中,快指针的位置靠前,慢指针则在快指针前一位,假定存在环路,可以理解成快指针在追赶慢指针.因为快指针每次走两步,慢指针每次走一步.

a.如果两指针相差一步, 慢指针在n的位置,而快指针在n-1的位置,此时慢指针走一步到n+1的位置,而快指针走2步,n-1+2=n+1,故此重合

b.如果两指针相差k步, 可以拆分成a情况,每次a情况下都是快指针追慢指针一步,所以最多追k次,就能重合

4.倒数k位置判定

思路:设置两个指针,先让快指针走k-1步,此时快慢指针相距k步,然后两指针同时向前走,直到快指针指向NULL,慢指针就在倒数k位置上

5.为什么说两指针重合要前进的步数一定小于环的长度呢?

因为,追赶的前提是快指针追赶慢指针,并且是在一个环形内.假定环长k, 在最极端的情况下,快指针在慢指针的前一个位置,此时快指针差慢指针k-1一个步子.上述所知,每一次操作,其实都可以转化成快指针追赶慢指针一步,所以快指针只要追k-1次即能重合.