s0142
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
# 链表
|
||||
|
||||
- [总结](./linked-list.md)
|
||||
- [环形链表](./linked_list_cycle.md)
|
||||
|
||||
# 字符串
|
||||
|
||||
|
@@ -8,14 +8,18 @@
|
||||
|
||||
```cpp
|
||||
void iter(ListNode *node) {
|
||||
// 终止条件
|
||||
if (node == nullptr) {
|
||||
return;
|
||||
}
|
||||
/*
|
||||
your
|
||||
condition
|
||||
从前往后遍历
|
||||
*/
|
||||
iter(node->next);
|
||||
/*
|
||||
从后往前遍历
|
||||
*/
|
||||
return;
|
||||
}
|
||||
```
|
||||
|
||||
|
40
notes/src/linked_list_cycle.md
Normal file
40
notes/src/linked_list_cycle.md
Normal file
@@ -0,0 +1,40 @@
|
||||
# 环形链表
|
||||
|
||||
[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
|
||||
|
Reference in New Issue
Block a user