解题方法一
使用Set/Map记录每个节点,然后while遍历使用Set/Map.has方法判断否存在当前节点,如果存在重复的节点,这个节点就是入环节点
var detectCycle = function(head) {
const record = new Set()
while(head) {
if (record.has(head)) return head
record.add(head)
head = head.next
}
return null
}
解题方法二
慢指针移动两步,快指针移动一步,相遇之后,快指针变成头指针,然后每次快慢指针各走一步直到相遇,相遇的节点就是入环节点
var detectCycle = function(head) {
if (head === null) {
return null
}
let slow = head, fast = head
while (fast !== null) {
slow = slow.next //慢指针移动两步,快指针移动一步
if (fast.next !== null) {
fast = fast.next.next
} else {
return null //如果没有环 之间返回null
}
if (fast === slow) {//有环
let fast = head
//快指针指向头节点,然后每次快慢指针各走一步直到相遇,相遇的节点就是入环节点
while (fast !== slow) {
fast = fast.next
slow = slow.next
}
return fast
}
}
return null
}