Floyd 判圈算法(Floyd Cycle Detection Algorithm)
- 前言
Floyd判圈算法属于对指针操作的算法,它一般需要且仅需要两个指针,通过设定不同的指针移动速度,来判定链表或有限状态机中是否存在环。人为规定移动较快的指针称为快速指针(fast pointer),移动较慢的指针称作慢速指针(slow pointer),快速指针比慢速指针移动速度快2倍。
- 链表中环判定
在判定链表中是否存在环过程中,快慢指针可能会出现下列两种情形之一:
a) 快速指针指向到达链表的结尾 (fast pointer =NULL),此种情况表明链表中不存在环。这里需要说明的是,快速指针一定先于慢速指针道道链表的尾部。
b) 快速指针在遍历过程中,赶上慢速指针,并且与慢速指针相会和。这种情况下表明链表中存在着环(Loop)。
具体看一个例子,显而易见,链表中存在一个环,环的起点为5,应用快慢指针对此链表进行遍历,并判断其是否存在环。

第一步,建立快慢指针两个变量,并且令快慢指针均指向头节点,准备开始以不同的速度进行移动指针,观察会出现上述提到的哪类情形。

令快指针以两倍于慢指针的速度向前移动



显而易见,当移动至第七个元素的时候,快指针赶上慢指针,在此处快慢指针相遇。符合第二类情形,所以判定链表中存在着环。
- 算法逻辑
如果存在环,那么快慢指针一定在某处相遇,那究竟是为什么呢? 借助相关图示进行数学分析和理解,

上图中,采用链表两个节点之间的数目来代表距离
X-代表头节点(Head)到 环起点 之间的距离(Loop start point)
Y-代表环起点(Loop start point)和两指针的第一次相遇点(Meet point)之间的距离
C-代表环的周长/距离
当快慢指针在相遇的时候,分别求出快慢指针移动的相应距离,慢指针移动的距离:
Distance_slow=X+Y+s∗C;s∈non−negative integer(非负整数) Distance\_slow=X+Y+s*C; s∈ non-negative\ integer(非负整数) Distance_slow=X+Y+s∗C;s∈non−negative integer(非负整数)
与之对应的是快指针移动的距离:
Distance_fast=X+Y+f∗C;f∈non−negative integer(非负整数) Distance\_fast=X+Y+f*C; f∈ non-negative\ integer(非负整数) Distance_fast=X+Y+f∗C;f
Floyd算法详解:检测链表中的环

Floyd判圈算法是一种使用快慢指针检测链表或有限状态机中是否存在环的算法。当快指针追上慢指针时,表示存在环。算法逻辑基于快指针移动距离是慢指针的两倍,通过距离关系找到环的起点。文章提供了一个详细的算法实现,包括创建链表、插入节点、检测环以及找到环的起点的函数,并附有测试案例。
最低0.47元/天 解锁文章
2294

被折叠的 条评论
为什么被折叠?



