写在前面: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成功执行,那说明传入的对象一定无环
var hasCycle = function(head) {
try {
JSON.stringify(head)
return false
} catch {
return true
}
};