leetcode/notes/src/linked_list_cycle.md

935 B

环形链表

Leetcode

可以用回溯法解这道题。

首先递归遍历链表的一般结构如下:

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