真题描述:给定一个链表,判断链表中是否有环。
示例 1: 输入:[3,2,0,4](链表结构如下图) 输出:true 解释:链表中存在一个环
插旗法
思路:走一步立一个flag,当有一个flag存在时该链表就有环
/**
* @param {ListNode} head
* @return {boolean}
*/
// 入参是头结点
const hasCycle = function(head) {
// 只要结点存在,那么就继续遍历
while(head){
// 如果 flag 已经立过了,那么说明环存在
if(head.flag){
return true;
}else{
// 如果 flag 没立过,就立一个 flag 再往
下走
head.flag = true;
head = head.next;
}
}
return false;
};
快慢指针
/**
* @param {ListNode} head
* @return {boolean}
*/
// 入参是头结点
const hasCycle = function(head) {
let fast = head
let slow = head
// 只要结点存在,那么就继续遍历
while(fast && fast.next){
slow = slow.next
fast = fast.next.next
if(slow == fast) return true;
}
return false;
};