📅  最后修改于: 2023-12-03 15:37:47.337000             🧑  作者: Mango
链表是一种常用的数据结构,它可以用来存储一个序列的元素,并且支持插入和删除操作。链表可以分为单链表和双向链表,以及循环链表和非循环链表。在循环链表中,最后一个节点的下一个节点指向第一个节点,形成一个环。
在循环链表中查找循环的第一个节点是一个常见的问题,下面我们来介绍一下实现的方法。
我们可以使用哈希表来存储每个节点的地址,然后遍历链表,对于每个节点,先查询哈希表中是否已经存在该节点的地址,如果不存在,则将该节点的地址添加到哈希表中;如果存在,则该节点就是循环的第一个节点。
时间复杂度:O(n) 空间复杂度:O(n)
class Solution:
def detectCycle(self, head: ListNode) -> ListNode:
seen = set()
node = head
while node:
if node in seen:
return node
seen.add(node)
node = node.next
return None
我们可以使用快慢指针来判断链表是否存在环,并找到循环的第一个节点。首先,使用快慢指针找到相遇点,当快指针和慢指针在相遇点相遇时,将慢指针移动到链表头,然后快指针和慢指针以相同的速度往前移动,当它们再次相遇时,就是循环的第一个节点。
时间复杂度:O(n) 空间复杂度:O(1)
class Solution:
def detectCycle(self, head: ListNode) -> ListNode:
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
slow = head
while slow != fast:
slow = slow.next
fast = fast.next
return slow
return None
注意事项: