# 问
给你一个链表的头节点(head),判断链表中是否有环?
- 有环 => 如果链表中某个节点可以通过连续next指针再次到达自身,则表示链表中存在环。
- 存在环 => return true || false
# 答
# 思路1: 借助JS的Set数据结构的唯一性
MDN - Set (opens new window) => 允许存储任何类型的唯一值(原始值、对象引用)。Set里存储的是结点的引用指针,每个结点的内存地址是唯一的。
var hasCycle = function(head) {
let set = new Set();
// 遍历链表,判断链表某个节点是否出现多次
while(head) {
if(set.has(head)) {
return true;
}else {
set.add(head)
}
head = head.next
}
return false
};
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 思路2: 设置快慢指针,如果存在环,两个指针最终一定会相遇
var hasCycle = function(head) {
let slow = head
let fast = head
while(fast && fast.next) {
slow = slow.next
fast = fast.next.next
if(slow === fast) return true
}
return false
};
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10