leetcode/notes/src/linked_list_cycle.md
2022-12-02 19:12:03 +08:00

41 lines
935 B
Markdown

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