【路飞】leetcode-141.环形链表

155 阅读1分钟

写在前面:2021/12/06 开始算法练习

加油 第 1 练

141. 环形链表

题目描述:给你一个链表的头节点 head ,判断链表中是否有环。

方法一:遍历存储

应该很多人读完题目首先想到的简单易懂的方法:遍历‘head’,每一个遍历到的元素存储到一个容器中,如果后面遍历到容器中已存储过的元素则说明存在环; (容器可以是array,map, Symbol,object,set...)

var hasCycle = function(head) {
    if (!head || !head.next) return false;

    // var arr = []
    // while(head){
    //     if(arr.includes(head)){
    //         return true
    //     }
    //     arr.push(head)
    //     head = head.next
    // }

    var mapper = new Map();
    while(head){
        if(mapper.has(head)){
            return true
        }
        mapper.set(head, head);
        head = head.next
    }

    return false
};

方法二:快慢指针

好比两个人赛跑,由同一起点出发,一人跑得快,一人跑的慢,如果赛道是环形的,那么跑的快的就有可能超过一圈再次与跑的慢相遇; 快指针与慢指针同时由索引0出发,慢指针走一针,快指针走两针,如果出现 快指针 == 慢指针,则说明有环。

var hasCycle = function(head) {
    if (!head || !head.next) return false;
    
    var fast = head,slow = head
    while(fast){
        if(!fast.next){
            return false
        }
        slow = slow.next
        fast = fast.next.next
        if(fast == slow){
            return true
        }
    }
    return false
};

方法三:利用JS语言特性

不得不说大佬真多,看别人的题解能长很多知识。 JSON.stringify方法会自动检测传入的对象是否有环,如果JSON.stringify成功执行,那说明传入的对象一定无环

image.png

var hasCycle = function(head) {
    try {
        JSON.stringify(head)
        return false
    } catch {
        return true
    }
};