# 环形链表 [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