0
点赞
收藏
分享

微信扫一扫

【Leetcode刷题笔记之链表篇】141. 环形链表

cnlinkchina 2022-01-20 阅读 62

😈博客主页:🐼大家好我叫张同学🐼
💖 欢迎点赞 👍 收藏 💗留言 📝 欢迎讨论! 👀
🎵本文由 【大家好我叫张同学】 原创,首发于 CSDN 🌟🌟🌟
精品专栏(不定时更新) 【数据结构+算法】 【做题笔记】【C语言编程学习】
☀️ 精品文章推荐
【C语言进阶学习笔记】三、字符串函数详解(1)(爆肝吐血整理,建议收藏!!!)
【C语言基础学习笔记】+【C语言进阶学习笔记】总结篇(坚持才有收获!)


前言
题目内容

在这里插入图片描述

原题链接(点击跳转)

暴力取巧法

要解决这个问题,有一个不算方法的方法,我们注意到题目中说了链表中节点的数目范围是[0, 10^4]
对于带环的链表,我们去求其长度,一定是大于10^4的(也就是10000)。
对于不带环的链表,其长度一定是小于等于10000的。因此这个地方可以取巧,直接取计算链表的长度,就可以判断是否带环。

函数实现
bool hasCycle(struct ListNode *head) {
    //暴力求解法 如果链表有环,长度计算length会无穷大
    struct ListNode* cur = head;
    int length = 0;
    while(cur && (length < 100001)) {
        cur = cur->next;
        length++;
    }
    if(cur == NULL)
        return false;
    else
        return true;
}

在这里插入图片描述
虽然这种方法可以求出链表是否带环,但实际中我们最好不要使用这种方法。
原因如下:


快慢指针法

要判断链表是否带环,一般都采用快慢指针的方法(快指针一次走两步慢指针一次走一步)。若链表不带环,那么快指针势必会走到最后一个结点或空结点,即fast = NULL,或 fast->next = NULL。若链表不带环,那么快指针后面就会一直在环里面走啊走,转啊转,出不去。若while循环中终止条件是fast == NULLfast->next == NULL,那么while循环就无法终止。为了在链表带环时,while循环还能终止,将条件改为 fast != slow。若带环,则fastslow必定会在环中相遇。(证明过程在后面
在这里插入图片描述

函数实现
bool hasCycle(struct ListNode *head) {
    if(head == NULL || head->next == NULL)
       return false;
    struct ListNode* fast = head->next;
    struct ListNode* slow = head;
    while(fast != slow){
        if(fast == NULL || fast->next == NULL)
            return false;
        fast = fast->next->next;
        slow = slow->next;
    }
    return true;
}

在这里插入图片描述
当然也可以这样写,这样就不需要利用虚拟结点,fast和slow同时从头结点head开始往后走。

bool hasCycle(struct ListNode *head) {
    struct ListNode *fast = head,*slow = head;
    while(fast && fast->next){
        fast = fast->next->next;
        slow = slow->next;
        if(fast == slow)
           return true;
    }
    return false;
}

在这里插入图片描述


带环问题的证明过程
这种证明问题在面试的时候经常会被问道,一般会从下面两个角度来提问:

在这里插入图片描述
问题(1)
答:一定可以追上,证明如下:

在这里插入图片描述
问题(2)
答:不一定可以追上,证明如下:

举报

相关推荐

0 条评论