判断链表中是否有环
使用标识
通过判断当前的节点是否有我们添加上去的标识,如果有标识是环,并且是环的入口
function foo(head) {
while(head) {
if(head.flag) return true;
head.flag = true;
head = head.next;
}
return false;
}
使用JSON.strify
因为JSON.strify不能序列化含有循环引用的结构
function foo(head) {
try {
JSON.strify(head);
return false;
} catch (err) {
return true;
}
}
使用快慢指针
使用两个指针,快指针每次跳2,慢指针每次跳1,如果有环,最后快慢指针相同,如果没有环,快指针为空
function foo(head) {
if(!head.next) return false;
let fast = head.next.next;
let slow = head.next;
while(fast) {
if(fast === slow) return true;
fast = fast.next.next;
slow = slow.next;
}
return false
}
行百里者半九十