数据结构之链表-判断链表是否有环
题目:判断给定的链表中是否有环。如果有环则返回true
,否则返回false
。你能给出空间复杂度O(1)
的解法么?
Leetcode
在线OJ
系统:传送门
示例1
:
graph LR A[3]-->B[2] B[2]-->C[0] C[0]-->D[-4] D[-4]-->B[2]
1 | 输出:true |
示例2
:
graph LR A[1]-->B[2] B[2]-->A[1]
1 | 输出:`true` |
示例3
:
graph LR A[1]
1 | 输出:`false` |
思路:将链表想象成校园里的操场,两位同学从同一起点开始比赛跑步,出发后,如果两位同学的跑步速度不一致,那么跑过若干圈后,他们一定会在跑道的某处相遇,且跑的快的同学恰好比跑的慢的同学多跑一圈。这是物理运动学上的经典追击问题。
对于链表来说,我们可以定义一快一慢两个指针,让它们同时从头节点同时出发,快指针每次走两步,慢指针每次走一步,如果它们最终能在某处“相遇”,说明链表有环,如果快指针走到链表末尾都没有追上走的慢的指针,说明链表无环。
以上的思路俗称:“快慢指针法”;学名:Floyd
判圈算法。
Floyd
判圈算法(Floyd Cycle Detection Algorithm
),又称龟兔赛跑算法(Tortoise and Hare Algorithm
),是一个可以在有限状态机、迭代函数或者链表上判断是否存在环,以及判断环的起点与长度的算法。
Java
语言实现如下:
单链表节点类定义可查看文章:数据结构之链表-基础知识
1 | public static boolean hasCycle(SinglyLinkedListNode head) { |
-------------有过牵挂了无牵挂-------------
欢迎关注微信公众号【打工这件小事】~
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 打工这件小事!
评论