如何判断链表是否有环

嵌入式技术

1338人已加入

描述

如何判断链表是否有环?

首先,有环的链表应该长这样。

null  

正常的单向链表最后一个结点的指针域应该是NULL,表示后面没有结点。

null  

但是如果把它改成前面某个结点的地址,就会变成这个样子,这样的链表就叫有环的链表。

  null


    如何判断链表是否有环,其中一个比较常见的方法就是,两个指针,经常把他们称作快慢指针,慢的指针每次走一步,快的指针每次走两步,如果链表没环,快的指针肯定最先达到终点;如果链表有环,那么两个指针迟早相遇。


null  

代码也极其简单:
 

int is_cross(Node *head)
{
    if (NULL == head)
        return 0;


    Node *fast = head;
    Node *slow = head;


    while (fast && slow)
    {   
        if (fast->next && fast->next->next)
            fast = fast->next->next;
        else
            break;


        if (slow->next)
            slow = slow->next;
        else
            break;


        if (fast == slow)
            return 1;
    }


    return 0;
}
 
很经典的面试题,不过一般面试官还会继续问,如何找出环开始的结点,这里就会涉及到一点数学问题。我直接来说步骤。


  null

 


当快指针和慢指针相遇的时候,再定义一个指针指开头。该指针和慢指针同时向后走。两个指针相遇的时候,就是环开始的结点。
 

 

int is_cross(Node *head)
{
    if (NULL == head)
        return 0;


    Node *fast = head;
    Node *slow = head;


    while (fast && slow)
    {
        if (fast->next && fast->next->next)
            fast = fast->next->next;
        else
            break;


        if (slow->next)
            slow = slow->next;
        else
            break;


        if (fast == slow)
        {
            Node *p = head;
            while (p != slow)
            {
                p = p->next;
                slow = slow->next;


                if (p == slow)
                {
                    /*环开始的结点*/
                }
            }
        }
    }


    return 0;
}

 

  审核编辑:汤梓红

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分