题目描述
思路分析
做这道题我第一反应是用“记事本”,也就是将遍历过的节点存储起来,如果下次再遍历到这个节点,那么也就是环的入口节点。遍历节点,如果是遍历过的,那么就直接返回这个节点,否则就将这个节点存起来。理解起来思路比较容易,做起来也比较快。
后来在参考别人的代码时发现它们用的数学方法,我也不太懂,思路大概如下:
代码参考
// 方法一,使用哈希表对对遍历过的链表节点进行保存,
// 如果之前已经遍历过,那么就将它的值设置为true,
// 后续在进行判断时先进行判断,如果为true则直接返回,也就是之前访问过该节点了
const EntryNodeOfLoop = function (head) {
if (!head || !head.next) return null
let p = head
// 使用map进行存储
const map = new Map()
while (p) {
if (map.get(p)) return p
else {
map.set(p, true)
}
p = p.next
}
}
// 方法二:(数学方法)
/*
使用快慢指针的方法
*/
function EntryNodeOfLoop2 (pHead) {
// 判断条件
if (!pHead || !pHead.next) return null
// 设置快慢指针
let fast = slow = pHead
while (fast && fast.next) {
slow = slow.next
fast = fast.next.next
if (slow == fast) {
let ptr = pHead
while (ptr != slow) {
ptr = ptr.next
slow = slow.next
}
return ptr
}
}
}
标签:结点,slow,ptr,fast,next,链表,遍历,BM7,节点
From: https://www.cnblogs.com/zx529/p/17015925.html