美文网首页一起学起来算法二叉树之下
如何判断一个单链表是否有环?

如何判断一个单链表是否有环?

作者: 中了胖毒 | 来源:发表于2015-10-13 20:28 被阅读7866次

三类情况:

(1) (2) (3)

1、遇到这个问题,首先想到的是遍历链表,寻找是否有相同地址,借此判断链表中是否有环。

listnode_ptr current =head->next;
while(current)
{
  if(current==head)
  {
    printf("有环!\n");
    return 0;
  }
  else
  {
    current=current->next;
  }
}
printf("无环!\n");
return 0;

这段代码满足了(1)(链表无环)、(2)(链表头尾相连)两类情况,却没有将(3)情况考虑在内,如果出现(3)类情况,程序会进入死循环。

2、将(3)考虑在内,首先想到我们可能需要一块空间来存储指针,遍历新指针时将其和储存的旧指针比对,若有相同指针,则该链表有环,否则将这个新指针存下来后继续往下读取,直到遇见NULL,这说明这个链表无环。

上述方法虽然可行,可是否还有更简便的算法?

3、假设有两个学生A和B在跑道上跑步,两人从相同起点出发,假设A的速度为2m/s,B的速度为1m/s,结果会发生什么?
答案很简单,A绕了跑道一圈之后会追上B!
将这个问题延伸到链表中,跑道就是链表,我们可以设置两个指针,a跑的快,b跑的慢,如果链表有环,那么当程序执行到某一状态时,a==b。如果链表没有环,程序会执行到a==NULL,结束。

listnode_ptr fast=head->next; 
listnode_ptr slow=head;
while(fast)
{
    if(fast==slow)
    {
        printf("环!\n");
        return 0;
    }
    else
    {
        fast=fast->next;
        if(!fast)
        {
            printf("无环!\n");
            return 0;
        }
        else
        {
            fast=fast->next;
            slow=slow->next;
        }
    }
}
printf("无环!\n"); 
return 0;

4、关于算法复杂度:



如图,链表长度为n,环节点个数为m,则循环 t=n-m 次时,slow进入环中,此时,我们假设fast与slow相距x个节点,那么,经过t'次循环,二者相遇时,有:
2t'=t'+(m-x) -> t'=m-x -> t'<=m.
因此,总共循环了T=t+t' <= n. 算法复杂度为O(n).

相关文章

  • 检测链表有环

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

  • 2022-02-27环形链表linked-list-cycle

    1.判断单链表是否有环 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续...

  • 链表

    现在有一个单向链表,谈一谈,如何判断链表中是否出现了环 考察点:链表参考回答:单链表有环,是指单链表中某个节点的n...

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

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

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

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

  • 判断一个单链表是否存在环

    问题:如题,判断一个单链表是否存在环 分析:判断一个单链表是否存在环,问题情况分为如下 [x] 首尾相连 [x] ...

  • 如何判断单链表是否存在环

    给定一个单链表,只给出头指针h: 如何判断是否存在环? 如何知道环的长度? 如何找出环的连接点在哪里? 带环链表的...

  • 快慢指针的应用

    什么是快慢指针:快慢指针是链表操作中的常用操作,最经典的应用是判断单链表中是否有环。 判断单链表是否存在环 两个指...

  • 链表判环

    如何判断一个单链表是否有环?有环的话返回进入环的第一个节点的地址,无环的话返回空。如果链表的长度为N,请做到时间复...

  • 5_12链表判环

    如何判断一个单链表是否有环?有环的话返回进入环的第一个节点的值,无环的话返回-1。如果链表的长度为N,请做到时间复...

网友评论

本文标题:如何判断一个单链表是否有环?

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