美文网首页数据结构
判断单链表是否有环、求环长和环入口最优算法

判断单链表是否有环、求环长和环入口最优算法

作者: 程序员will | 来源:发表于2019-11-05 15:36 被阅读0次

判断单链表是否有环、求环长和环入口最优算法

判断单链表是否有环是一个十分经典的算法问题,许多考试或者面试都有很大的几率出现。如果事先对此没有一定的理解,临场发挥可能就比较困难了。

判断链表是否有环

  • 首先定义两个指针 slow 和 fast,初始都指向链表头指针 head;
  • 然后,slow 每走一步(每次移动一个节点),fast 走两步(移动两个节点);
  • 如果 fast 遇到了 NULL,则链表不存在环;
  • 如果 slow==fast,则链表存在环;
判断单链表是否有环、求环长和环入口最优算法

判断单链表是否有环、求环长和环入口最优算法

为什么 slow==fast 就一定会存在环呢?

因为,如果存在环,fast 和 slow 肯定会先后进入环;

当 slow 刚好进入环时,fast 肯定已经在环内的某一个位置了;

而又因 fast 走的速度是 slow 的两倍,所以在 slow 在环内遍历一遍的过程中,fast 指针必然会与 slow 相遇。

其实两个指针就像是两个人在田径场上跑步,一个人的速度是另一个人速度的两倍。无论两个人的起点在何处,慢的人跑完一圈,快的人必然跑完两圈,所以他们必然相遇过。

复杂度分析

设链表长度为 n,显然时间复杂度为 O(n);

空复杂度为 O(1)。

求环的长度

上面已经可以判断出是否有环了,如果有环,那么环的长度又是多少呢?该怎么求?

这就很简单了,前面已经将环判断出来了,所找到的 slow 和 fast 相遇点必然是在环内的,记录该节点;

所以此时只需用一个指针 p 继续一步步遍历链表,并计数,直到指针 p 重新指向上面的相遇节点,此时计数的值就为环长了。

复杂度分析

设链表长度为 n,环长为 r 。

如果是在知道一个环内节点的情况下,那么时间复杂度为 O(r),空间复杂度为 O(1);

如果是在不知道是否有环的情况下,那么时间复杂度为 O(n+r),空间复杂度为 O(1)。

求环的入口

前面已经判断出是否有环了,并求出了环的长度,此时求环的入口也变得很简单了。

  • 定义两个指针 p 和 q,初始指向链表头指针 Head;
  • q 首先移动 r 个节点(r 为环的节点数),p 不动;
  • 然后 p 和 q 一起每次移动一个节点;
  • 直到 p==q,此时 p 和 q 指向的就是环的入口了;

这个应该很容易理解吧,q 比 p 先走了一个环的长度,所以当 p 刚好走到环的入口时,q 就刚刚好遍历了环一遍。

复杂度分析

设链表长度为 n,环长为 r 。

如果是在知道一个环长度的情况下,那么时间复杂度为 O(n),空间复杂度为 O(1);

如果是在不知道环长度的情况下,那么时间复杂度为 O(n+r+n)= O(n+r),空间复杂度为 O(1)。

求链表的长度

链表长度 = 头结点到环入口节点的长度 + 环长度

所以此时,只需用一个指针从头遍历链表节点并计数,求出头结点到环入口节点的长度即可。

相关文章

  • 判断单链表是否有环、求环长和环入口最优算法

    判断单链表是否有环、求环长和环入口最优算法 判断单链表是否有环是一个十分经典的算法问题,许多考试或者面试都有很大的...

  • P111-判断一个单向链表是否构成了环形,找出环的出口

    判断是否为环 思路1 两个指针 思路2 map 求入口 参考:链表有环,判断环的入口点 求环长 参考:那么如何得到...

  • 算法题面试复习

    算法模块 1. 链表 1. 链表翻转 2. 单链表判断是不是环+求环位置+求环长度 以图片为例,假设环入口距离链表...

  • 检测链表有环

    题目:如何判断一个单链表是否有环?若有环,如何找出环的入口节点。 一、单链表是否有环 思路分析: 单链表有环,是指...

  • 有环单链表的相关问题

    问题:判断单链表是否有环;若有环,找出环的入口节点;若有环,求出环上节点的个数;若有环,求出整个链表的节点的个数;...

  • 单链表中存在环的相关问题Java实现

    问题描述 判断一个单链表是否有环? 如果存在环,如何得到环中节点的数目? 如果存在环,如何找到环的入口? 解题思路...

  • 算法应用-单链表

    单向链表中代码实现检查是否有环,如果有环,求环的长度和入环的节点? 思路: 假设单链表如上图,检查是否有环这个简单...

  • 环检测算法(Floyd's Tortoise and H

    Cycle Detect 环检测算法常用检测链表是否有环,如果有环,给出环的长度和环的入口点。相关题目: 287....

  • 2018-08-21

    算法题之判断单链表是否有环 判断单链表是否有环的算法核心思想是用两个指针,一个走的慢,一个走得快,如果两个相遇了则...

  • 链表

    单向链表 链表反转 判断是否有环,找链表的中间节点 快慢指针 找环的入口(求两个链表的交点可以转化成这个问题) p...

网友评论

    本文标题:判断单链表是否有环、求环长和环入口最优算法

    本文链接:https://www.haomeiwen.com/subject/rrxebctx.html