935 B
935 B
环形链表
可以用回溯法解这道题。
首先递归遍历链表的一般结构如下:
void iter(ListNode *node) {
// 终止条件
if (node == nullptr) {
return;
}
/*
从前往后遍历
*/
iter(node->next);
/*
从后往前遍历
*/
return;
}
而查找链表中是否有环的思路是快慢指针,如果相遇则说明有环。
所以我们可以这样:
终止条件是快指针走到链表末尾或者快慢指针相遇。
从前往后遍历不需要做什么额外操作。
从后往前遍历的时候先把快指针的足迹记录到一个哈希表中,键值是节点地址,值是快指针经过的次数。
当出现以下两种情况的时候就说明找到了环的入口:
- footprint[fast] == 1 && footprint[fast->next] > 1
- footprint[fast->next] == 1 && footprint[fast->next->next] > 1