141. 环形链表 JavaScript实现

94 阅读1分钟

141. 环形链表

环形链表

一、哈希表

将遍历遇到的节点均放在一个集合当中,用哈希表的目的是可以去重,即一个链表当中可能有重复的元素,从而误判存在环。如果存在环,那么集合中会出现相同的元素。

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
var hasCycle = function(head) {
    // 定义一个哈希表,用来快速查找元素。并且保证里面是值是唯一的,避免重复元素的出现,导致误判。
    var map = new Map();
    
    // 遍历链表,存在相同的即为环。不存在即不为环
    while(head != null){
        if (map.has(head)) return true;
        // 没有在哈希表中找到就加入
        map.set(head);
        // 移动指针
        head = head.next;
    }
    // 整个遍历完,没有就是没有环
    return false;
};

二、快慢指针

思想:设置快慢指针,如果链表中存在环,那么快指针会提前进入环,并且一直在环当中。慢指针会稍后进去环,但是快慢指针由于前进的速度不一样,所以一定会在环中相遇。 在这里插入图片描述

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
var hasCycle = function(head) {
    // 进行判空和一个节点的处理
    if (head == null || head.next == null) return false;
    
    
    // 定义快慢指针
    let slow = head;
    let quick = slow.next;
    
    // 节点均不空的情况下 :终止条件 slow=quick,所以slow和quick开始不能指向同一个地方,要不然无法移动。
    while(slow != quick){
        // 当其中一个节点为空或者下一个为空的时候,提前终止
        if (quick == null || quick.next == null) return false;
        
        // 快慢指针的移动速度,快指针移动两个,慢指针移动一个.如果移动相同的速度,会一直一前一后。
        slow = slow.next;
        quick = quick.next.next;
    }
    
    return true;   
};