Floyd判圈算法(Floyd Cycle Detection Algorithm),又称龟兔赛跑算法(Tortoise and Hare Algorithm),是一个可以在有限状态机、迭代函数或者链表上判断是否存在环,以及判断环的起点与长度的算法。
其算法的思想如下:
如果有环=》
- 有限时间内快慢指针必然相遇且相遇点在环上
- 相遇点和起点的等速指针将在环的入口处相遇
其算法的用处如下:
- 判断是否有环
- 找到环的起点
- 计算环的长度
1,判断是否有环=》
这个非常简单。设计一个快指针,一个慢指针,同时从起点出发,有限时间后 快慢指针能相遇即代表有环,永远不相遇代表没环。道理很简单,好比龟兔在操场上的环形跑道上赛跑,同时从起点出发,兔子比乌龟速度快,两者匀速,那么有限的时间后兔子一定能追上跑得慢的乌龟,再次相遇时,且兔子领先乌龟刚好一圈。但如果是在线性路上赛跑,兔子将持续领先,中途永远也不会相遇,直到兔子到达终点停下来。
如下图,用快慢指针简单模拟一下龟兔赛跑。从起点出发,兔子一次跑两步,乌龟一次跑一步。
2,找到环的起点=》
我们发现,龟兔确实