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;
};