You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

链表环起点检测:标记法替代快慢指针算法遇问题求助

标记法检测链表环起点的可行性与问题分析

这个思路本质是可行的,通过修改节点的next指针指向临时节点来标记已访问状态,确实能定位环的起点,但你的实现存在几个关键问题,导致测试用例无法全部通过:

1. 无环场景返回值不符合预期

你的代码在无环时返回整数-1,但这类问题的常规预期返回值是None(表示不存在环)。如果测试用例校验返回值的类型或语义,这里会直接判定失败。

2. 未处理空链表的边界情况

如果输入的root是None(空链表),执行curr.next时会直接抛出AttributeError,导致测试用例崩溃。

3. 永久破坏原链表结构

这是导致测试用例大面积失败的核心原因:你的代码会把所有遍历过的节点的next指针都修改为临时节点,彻底破坏原链表的结构。如果测试用例需要复用输入链表(比如连续多轮测试共用同一链表),后续测试都会因为链表结构被篡改而失败。

4. 循环逻辑的潜在风险

虽然大部分环场景能正确返回起点,但如果环的起点是头节点且环长度为1(root.next = root),你的代码会先修改头节点的next为临时节点,再绕回头节点触发返回,逻辑是正确的;但如果测试用例要求严格保持原链表状态,这种修改行为本身就不符合要求。

修复后的实现(保留标记法思路)

如果允许修改原链表,可调整代码解决前两个问题:

@staticmethod
def get_node_start_cycle(root):
    if not root:  # 处理空链表边界
        return None
    curr = root
    tmp_node = Node(-1)
    while curr.next:
        if curr.next == tmp_node:
            return curr
        tmp_next = curr.next
        curr.next = tmp_node
        curr = tmp_next
    # 无环时返回None而非-1
    return None

如果要求不修改原链表,更稳妥的标记法是用哈希集合记录已访问节点:

@staticmethod
def get_node_start_cycle(root):
    visited = set()
    curr = root
    while curr:
        if curr in visited:
            return curr
        visited.add(curr)
        curr = curr.next
    return None

内容的提问来源于stack exchange,提问作者Jose Alberto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:54:56