📜  数据结构 |链表 |问题 8(1)

📅  最后修改于: 2023-12-03 15:26:09.126000             🧑  作者: Mango

链表问题8:判断链表是否有环

问题描述

如何判断一个链表是否有环?如果有环,如何找到环的起点?

解决方法
1. 使用哈希表

使用哈希表来记录每个节点是否被访问过,如果一个节点被访问过两次,则说明链表有环。时间复杂度为 O(n),空间复杂度为 O(n)。

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        node_set = set()
        while head:
            if head in node_set:
                return True
            node_set.add(head)
            head = head.next
        return False
2. 快慢指针

使用两个指针,一个指针每次向前移动一个节点,另一个指针每次向前移动两个节点。如果链表有环,则两个指针会在某一时刻相遇。时间复杂度为 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:
                break
        else:
            return None
        slow = head
        while slow != fast:
            slow = slow.next
            fast = fast.next
        return slow
总结

判断链表是否有环是链表问题中的一个经典问题,掌握上述两种解法可以很好地应对这类问题。使用哈希表相对简单,但会使用更多的内存;快慢指针需要像数学证明一样理解才能防止出错,但空间复杂度比哈希表要低。