为了账号安全,请及时绑定邮箱和手机立即绑定

【学习打卡】第五天 数据结构和算法

链表 - 具体案例

一、环形链表【leetcode - 141】

给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。

思路一:【循环 + Set或者数组】

  1. 声明一个Set或者数组序列中;
  2. 循环链表的每一个节点,如果数组中没有该节点,则添加到序列中;如果数组中有该节点,表示链表中存在环,直接返回true;
  3. 循环结束后,直接返回false;
function hasCycle(head) {
    let set = new Set();
    let p1 = head;
    
    while(p1) {
        if(set.has(p1)) {
            return true;
        }
        set.add(p1);
        p1 = p1.next;
    }
    
    return false;
};

思路二:【快慢指针】

  1. 定义快慢两个指针
  2. 每次快指针走2步,慢指针走1步
  3. 循环链表,如果快慢指针相等,则是环形链表
  4. 如果循环完成后,快慢指针不相等,则不是环形链表
快慢指针起始位置相同
function hasCycle(head) {
    let p1 = head;
    let p2 = head;

    while(p1 && p2 && p2.next) {
        p1 = p1.next;
        p2 = p2.next.next;
        if(p1 === p2) {
            return true;
        }
    }

    return false;
};
快慢指针起始位置不同
function hasCycle(head) {
    if(!head || !head.next) {
        return false
    }
    let slow = head;
    let fast = head.next;

    while(slow !== fast) {
        if(!fast || !fast.next) {
            return false;
        }
        slow = slow.next;
        fast = fast.next.next;
    }

    return true;
};
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消