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个元素。可以思考一下怎么解决。

在这里插入图片描述

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页