AXin说算法:如何判断链表有环?

Posted xietx1995

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AXin说算法:如何判断链表有环?相关的知识,希望对你有一定的参考价值。

面试官:你来说说怎么判断链表有环?

AXin:什…什么是链表有环?

面试官:环都不知奥?喝乌俺~huan,环,就是下面这个样子,只会出现情况1和情况2,不会出现情况3这种。而且环有且只有一个,一定包含最后一个节点。(PS:情况3已经是有向图了,不是链表)

AXin:我…我想一想。

面试官:别墨迹了,你就说你会不会吧?

【30分钟后…】

AXin:我想到了!

面试官:快说!我两把王者都打完了!

AXin:好嘞!用两个指针,指针A一次向前走一步,指针B一次向前走两步,如果指针A和指针B能够相遇,说明链表中有环。

面试官:算你聪明,解释解释怎么个走法。

AXin:我拿张纸划给你看,你就知道了。

【片刻之后…】

AXin:当当当当!看图!

面试官:不错!有那味儿了。图画得挺好!你懂美术?

AXin:略懂~ 略懂~

面试官:光画图没用,你给我把代码写出来!

AXin:好!

【片刻之后】

AXin:请您过目!

/**
 * Definition for singly-linked list.
 * struct ListNode 
 *     int val;
 *     struct ListNode *next;
 * ;
 */
bool hasCycle(struct ListNode *head) 
    if(NULL == head)
        return false;

    struct ListNode *fast = head;
    struct ListNode *slow = head;

    // 注意fast->next可能为空指针
    while(slow && fast && fast->next)
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast)
            return true;
    

    return false;

面试官:好!明天来上班!

此种方法使用了两个指针,一个走得快,一个走得慢,称为“快慢指针”法。除了判断链表中是否有环,还可以解决其他类似的问题,例如:找出单链表中倒数第K个元素。可以思考一下怎么解决。

以上是关于AXin说算法:如何判断链表有环?的主要内容,如果未能解决你的问题,请参考以下文章

算法问题如何判断链表有环

算法如何判断链表是否有环

算法如何判断链表是否有环

算法如何判断链表是否有环

数据结构与算法判断一个单链表是否有环及环入口

AXin说算法:找出链表中倒数第K个节点