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

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

数据结构 | 链表 | 问题 4

问题描述

给定一个链表,判断该链表是否有环路。若有环路返回 true,否则返回 false

解决方案

一种常见的解决方案是使用两个指针,一个快指针 fast 和一个慢指针 slow,同时从链表头部出发。每次循环,快指针 fast 前进两步,慢指针 slow 前进一步。如果快指针 fast 追上了慢指针 slow,说明该链表存在环路。

代码如下:

def has_cycle(head: ListNode) -> bool:
    if not head or not head.next:
        return False

    slow = head
    fast = head.next
    while slow != fast:
        if not fast or not fast.next:
            return False
        slow = slow.next
        fast = fast.next.next
    return True

其中,ListNode 表示链表节点的类,其定义如下:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
复杂度分析
  • 时间复杂度:$O(n)$,其中 $n$ 是链表的长度。
  • 空间复杂度:$O(1)$,只使用了常数级别的额外空间。
测试样例

现给出一些测试样例:

  • 空链表:返回 False
  • 只有一个节点:返回 False
  • 没有环路:返回 False
  • 有环路:返回 True
总结

链表环路判断是一道经典的面试题,掌握解决方案对于程序员来说是必不可少的。