面试:如何检查单向链表是否有环

67 阅读2分钟

最近在字节飞书项目的面试遇到这个问题没答上来,平时疏于练习算法,亡羊补牢一下。 单向链表是否存在环是计算机科学和编程中的一个常见问题。为了确定单向链表是否存在环,我们可以使用多种方法。下面,我将介绍两种常用的方法:快慢指针法和哈希表法。

1. 快慢指针法(Floyd's Cycle-Finding Algorithm)

这种方法的基本思想是使用两个指针,一个快指针和一个慢指针,它们从链表的头部开始移动。

  • 慢指针:每次移动一步。
  • 快指针:每次移动两步。

如果链表中不存在环,那么快指针最终会到达链表的尾部并变为null。但如果链表中存在环,快指针最终会追上慢指针,因为它的速度是慢指针的两倍。

2. 哈希表法

我们可以使用一个哈希表来存储已经访问过的节点。当我们遍历链表时,对于每个节点,我们都检查它是否已经在哈希表中。如果节点已经存在于哈希表中,那么链表中存在环。如果节点不在哈希表中,我们将其添加到哈希表中。如果我们遍历完整个链表都没有找到重复的节点,那么链表中不存在环。

比较

空间复杂度

  • 快慢指针法:O(1)。
  • 哈希表法:O(n)。

时间复杂度

  • 快慢指针法和哈希表法都是:O(n)。

尽管两种方法在时间复杂度上相同,但在空间复杂度上,快慢指针法更有优势。然而,哈希表方法提供了更多的信息,例如环的起始节点。

结论

建议首先尝试使用快慢指针法,因为它不需要额外的空间。但如果需要确定环的起始位置或其他相关信息,哈希表法可能更为合适。