41 lines
935 B
Markdown
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
|
|
|