什么是快慢指针?
快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2次,慢指针每次向前移动1次。
快慢指针的常见应用
1.判断单链表是否为循环链表
对于初学循环链表者,可能开始想到的方法就是使用双重循环。当外层循环步进一个节点时,内层循环就遍历外层循环那节点之后的所有节点,然后比较内外循环的两个节点。若有节点地址相等,则表明该单链表是有循环的,反之则不存在循环。这种方法无疑效率比较低。
而快慢指针应用于这个场景效率会明显提高。就像生活中的一个场景:一些人绕着环形跑道跑步,有的人快点,有的人慢点,过了一段时间会发现快的人又经过慢的人身旁,这就是循环跑。那么如果是理想直线跑道的话,两个人便不会相遇了,就没有绕圈即循环的性质。
快慢指针的思想就是这样。快指针每次步进多个结点(视情况而定),慢指针每次只步进一个节点。那么如果该链表存在循环的话,快指针一定会再次碰到慢指针,反之则不存在循环。
代码示例:
例如长度为8,从1开始:1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 1 |
1 | 3 | 5 | 7 | 1 | 3 | 5 | 7 | 1 |
该方法在不借助计数器变量的情况下,实现寻找中位数的功能。原理是:快指针的移动速度若是慢指针的2倍,当快指针到达链表尾部时,慢指针到达中点。可以想到尾部和中点的情况和节点数的奇偶有关。例如移动次数若为x,若1+2x到达了表尾,链表就有奇数个节点,此时慢指针为1+x,直接返回慢指针指向的数据即可。如果快指针指向倒数第二个节点,说明链表节点数为偶数,这时可以根据“规则”返回上中位数(1+x内容),下中位数(1+x+1内容),或者上下的平均数。
代码示例:
3.如果链表存在环,怎么找到环的入口点呢?新闻热点
疑难解答