logo

链表 - 环形链表 I

作者:沙与沫2024.01.18 11:41浏览量:2

简介:介绍如何检测一个链表中是否存在环,并判断环的起始节点。通过使用快慢指针的方法,可以在 O(n) 时间复杂度内解决该问题。

链表中的环形结构是一个常见的问题,对于检测是否存在环以及确定环的起始节点,可以使用快慢指针的方法来解决。下面我们将通过具体的步骤和代码来解释这个算法。
首先,我们需要定义链表节点的数据结构。在 Python 中,我们可以使用以下代码定义链表节点:

  1. class ListNode:
  2. def __init__(self, val=0, next=None):
  3. self.val = val
  4. self.next = next

接下来,我们可以使用快慢指针的方法来检测链表中是否存在环。快指针每次移动两个节点,慢指针每次移动一个节点。如果链表中存在环,那么快指针和慢指针最终会在环内的某个节点相遇。如果链表中不存在环,那么快指针将会到达链表的末尾。
下面是一个示例代码,展示了如何使用快慢指针的方法检测链表中是否存在环:

  1. def hasCycle(head: ListNode) -> bool:
  2. if not head or not head.next:
  3. return False
  4. slow = head
  5. fast = head.next
  6. while slow != fast:
  7. if not fast or not fast.next:
  8. return False
  9. slow = slow.next
  10. fast = fast.next.next
  11. return True

在这个函数中,我们首先检查链表是否为空或只有一个节点,如果是的话,直接返回 False,因为这种情况下不可能存在环。然后我们初始化两个指针,slow 和 fast,分别指向链表的头节点和第二个节点。在 while 循环中,我们不断移动指针,直到 slow 和 fast 相遇或 fast 到达链表末尾。如果 fast 到达了链表末尾,说明链表中不存在环,返回 False;否则,说明链表中存在环,返回 True。
除了检测链表中是否存在环之外,有时候我们还需要确定环的起始节点。这可以通过在检测到存在环后,继续让 slow 指针移动,直到它再次回到初始位置来实现。在上面的代码中,我们可以通过以下方式找到环的起始节点:

  1. def findStart(head: ListNode) -> int:
  2. slow = head
  3. while True:
  4. slow = slow.next
  5. if slow == head:
  6. break
  7. return slow.val

在这个函数中,我们让 slow 指针不断地移动,直到它再次回到初始位置。此时 slow 指向的就是环的起始节点。然后我们返回 slow 的值即可。
总结起来,通过使用快慢指针的方法,我们可以有效地检测链表中是否存在环,并确定环的起始节点。这种方法的时间复杂度为 O(n),其中 n 是链表的长度。

相关文章推荐

发表评论