【路飞】算法与数据结构-环形链表

131 阅读2分钟

不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。

LeetCode:原题地址

题目要求

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

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos-1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

如果链表中存在环,则返回 true 。 否则,返回 false 。

例 1:

leetcode-lb-II-01.png

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

例 2:

leetcode-lb-II-02.png

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

例 3:

leetcode-lb-II-03.png

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

思路

  • 遍历链表,同时用Map储存每个节点的指向。

  • 同时检查当前节点的指向是否已经在Map中储存,如果有则表示有两个节点指向了同一个节点,即为有环。

  • 代码中用Map实现,实际用Set也可以。

  • 此解法虽然可以成功判断是否存在环,但在142. 环形链表 II中,会因为无法正确判断环形链表只有1和2个元素时的指向而失败。

代码

var detectCycle = function(head) {
    const visited = new Set();
    while (head !== null) {//终止条件,如果没有环 跳出循环
        if (visited.has(head)) {//如果存在重复的节点,这个节点就是入环节点
            return head;
        }
        visited.add(head);//将节点加入set中
        head = head.next;
    }
    return null;
};