前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 141.环形链表 - JavaScript

LeetCode 141.环形链表 - JavaScript

作者头像
心谭博客
发布2020-04-21 15:41:33
4080
发布2020-04-21 15:41:33
举报
文章被收录于专栏:YuanXinYuanXin

题目描述:给定一个链表,判断链表中是否有环。

解法 1:Floyd 判圈算法

Floyd 判圈算法类似龟兔赛跑,需要用到快指针 fast 和慢指针 slow。算法流程是:

  • slow 每次移动 1 不,fast 移动 2 步
  • 一直移动下去,若 slow、fast 相遇,那么必有环;若 slow 或 fast 抵达边界,那么不存在环。

代码实现如下:

代码语言:javascript
复制
// ac地址:https://leetcode-cn.com/problems/linked-list-cycle/
// 原文地址:https://xxoo521.com/2020-03-03-linked-list-cycle/

/**
 * @param {ListNode} head
 * @return {boolean}
 */
var hasCycle = function(head) {
    let slow = head;
    let fast = head;

    while (slow && fast && fast.next) {
        slow = slow.next;
        fast = fast.next.next;
        if (slow === fast) return true;
    }
    return false;
};

解法 2: 哈希表

这种解法比较容易想到,使用哈希表来记录节点是否出现过。若存在环,那么一直向下访问,一定会回到环的入口处。

代码实现如下:

代码语言:javascript
复制
// ac地址:https://leetcode-cn.com/problems/linked-list-cycle/
// 原文地址:https://xxoo521.com/2020-03-03-linked-list-cycle/

/**
 * @param {ListNode} head
 * @return {boolean}
 */
var hasCycle = function(head) {
    if (!head) return false;

    const map = new Map();
    let node = head;
    map.set(node, true);

    while (node.next) {
        if (map.get(node.next)) {
            // map.clear() // 节省时间可以去掉
            return true;
        }
        map.set(node.next, true);
        node = node.next;
    }
    // map.clear()
    return false;
};
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解法 1:Floyd 判圈算法
  • 解法 2: 哈希表
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档