一、Floyd判圈算法
Floyd判圈算法(Floyd Cycle Detection Algorithm),又称龟兔赛跑算法(Tortoise and Hare Algorithm),快慢指针算法。
核心思想:
- 初始化两个指针:
设置两个指针,slow 和 fast,都指向链表的头结点。 - 移动指针:
slow 每次移动一步,fast 每次移动两步。 - 判断条件:
如果 fast 或 fast->next 为 NULL,说明链表没有回路,返回 false。
如果 slow 和 fast 相遇(即 slow == fast),说明链表中有回路,返回 true。 - 重复步骤:
继续移动指针,直到找到回路或遍历完链表。
时间复杂度
O(n)
空间复杂度
O(1)
优点
效率高,实现简单。
二、利用哈希表
核心思想
- 初始化一个空的哈希表,用哈希表记录访问过的结点。
- 从头结点开始访问。若哈希表中没有该结点(此结点没有被访问过),将该结点添加到哈希表中;若哈希表中已存在该结点,证明单链表中存在回路。环的入口即为哈希表中与该结点重复的结点。
- 若一直访问到尾结点都没有出现重复访问,证明单链表中不存在回路。
时间复杂度
O(n)
空间复杂度
O(n)
三、直接修改链表
核心思想
依然是准备遍历整个单链表,在每个结点增加表示是否被访问过的flag,将访问过的结点flag置为1。若访问到flag为1的结点,证明单链表中存在回路。
缺点
改变了原链表的结构,可能带来一些问题。
时间复杂度
O(n)
空间复杂度
O(1)
四、使用计数器
核心思想
初始化计数器为0,每访问过一个结点就让计数器加一。若计数器的大小超过了链表的结点数,证明链表中存在回路。
缺点
必须在已知链表中结点数的前提下才能使用。
时间复杂度
O(n)
空间复杂度
O(1)
总结
使用Floyd判圈算法最为高效。