leetcode环形链表(一和二)「无耻做法」

本文讲解了如何通过flag标记法和快慢指针法判断环形链表及其环的入口节点,介绍了两种经典解决方案,并强调了在实际问题中遇到的限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环形链表⚡⚡⚡

        环形链表I🚀🚀🚀

        题目传送门:环形链表I (opens new window)

        题意:给你一个链表,你需要去判断一下这个链表有没有环。    

        想法:💦💦💦

                判断一个链表有没有环,只需要判断我们有没有重复走这个链表的某个节点就好,那怎么判断有没有重复走过这个位置呢?

Tips:链表是一个对象,是对象就可以挂载其他的属性,

比如挂载一个flag来表示这个走过没有,

如果走过了,那很明显,有环,为true;

如果没走过,那就无环咯🐠🐠🐠

AC代码:

var hasCycle = function(head) {
    while(head){
        if(head.flag) return true;
        else{
            head.flag = true;
            head = head.next;
        }
    }
    return false;
};

怎么样?这道easy确实给我们做出了easy的感觉。

再来看看下面这个medium !

        环形链表II

        题目传送门:环形链表II (opens new window)

        题意:给你一个链表,让你返回链表开始入环的第一个节点。 如果链表无环,则返回 null

        思路:🐧🐧🐧

                这道题有两种做法,

                一种是上文中提到的flag标记法,

                flag标记法极其轻便快捷

var detectCycle = function(head) {
    cnt = 0
    while(head){
        if(head.flag){
            // console.log('返回索引为 '+ head.index +' 的链表节点');
            return head;
            return 0;
        }
        else{
            head.flag = true;
            head = head.next;
            // head.index = cnt;
            // cnt++;
        }
    }
    // console.log('返回 null');
    return null;
};

BUT!!!

你用不了啊(bushi

看看题目怎么说的:

不允许修改链表! (他真的,我哭死-----这么简单的方法不能用

好了,别哭了,快来看看第二种方法!

快慢指针做法:
使用快慢指针法来做就很好做
假设:

链表的长度为 a(链) + b (环)
fast = 2 * slow & fast = slow + n * b
所以 slow = n * b
当 fast 和 slow 碰面的时候,只需要让slow再走a个步子就可以了。

var detectCycle = function(head) {
    let slow = head;
    let fast = head;
    while(true){
        if(fast === null || fast.next === null){
            return null;
        }
        slow = slow.next;
        fast = fast.next.next;
        if(slow === fast){
            break;
        }
    }
    let newHead = head;
    while(newHead !== slow){
        newHead = newHead.next;
        slow = slow.next;
    }
    return slow;
};

好啦!

讲到这里就讲完啦,大家记得下去自己实操一遍嗷!

纸上得来终觉浅,不如回去敲代码!

码字不易~

能给个赞嘛✨✨✨

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值