思路
快慢指针:慢指针走一步,快指针走两步。有环快慢指针定会相遇,无环则快指针定能走到终点。
代码
function hasCycle( head ) {
let fast = head;
let slow = head;
while(fast!=null && fast.next!=null){
slow = slow.next;
fast = fast.next.next;
if(fast==slow) return true;
}
return false;
}
module.exports = {
hasCycle : hasCycle
};
拓展1:求环长
相遇时,快指针比慢指针多走的路即为
环长的整数倍。
拓展2:求环起点
相遇后,
让慢指针重回头节点
,快慢指针都只走一步,再次相遇即为环的起点。
代码
function EntryNodeOfLoop(pHead)
{
let slow = pHead;
let fast = pHead;
let isCircle = false;
while(fast!=null && fast.next!=null){
slow = slow.next;
fast = fast.next.next;
if(slow==fast){
isCircle = true;
break;
};
}
if(isCircle){
slow = pHead;
while(slow!=fast){
slow = slow.next;
fast = fast.next;
}
return slow;
}else{
return null;
}
}
module.exports = {
EntryNodeOfLoop : EntryNodeOfLoop
};