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

Python实现链表反转报AttributeError及答案错误求解

代码存在的具体问题
  • 边界场景完全没有做兼容,这就是线上抛出AttributeError的直接原因。线上评测会覆盖空链表(传入的head为None)、单节点链表(head.next为None)这类用例,你的代码一上来就直接访问head.next.val,只要碰到上述场景,就会触发NoneType对象没有对应属性的报错。你本地只跑了两个节点的测试用例,所以没触发这个运行时错误,只拿到断言失败的提示。
  • 核心反转逻辑完全错误。你对链表反转的实现思路有本质偏差:反转链表不是新建一个节点、拿原链表第二个节点的值再指向原头节点就完成了。反转需要遍历整条链表,把每个节点的next指针从指向后继节点改成指向前驱节点。你现在写的逻辑执行完,原头节点的next还是指向原来的第二个节点,最后会形成5->2->5->2...的死循环链表,根本不符合反转要求。实际上反转操作完全不需要额外新建节点,直接修改原有节点的指针指向即可。
  • 本地测试的断言逻辑本身有缺陷。Python中自定义类如果没有手动实现__eq__方法,默认用==比较的是两个对象的内存地址,不是属性值是否相等。你测试代码里assert右侧新创建的Node(node1,5)是全新实例,和你函数返回的节点内存地址完全不同,哪怕你函数返回的节点值和指针都正确,这个断言也会判定失败。
正确实现参考

最常用的迭代法实现,时间复杂度O(n),空间复杂度O(1):

def reverseLL(head):
    prev = None
    current = head
    while current is not None:
        # 暂存下一个节点,避免改完指针后丢失后续链表
        next_temp = current.next
        # 反转当前节点的指针指向
        current.next = prev
        # 前驱指针后移
        prev = current
        # 当前遍历指针后移
        current = next_temp
    # 遍历结束后prev就是反转后的新头节点
    return prev

测试时不要直接用==比较自定义节点对象,可以遍历链表逐节点校验值和指针关系,比如两节点的示例反转后,头节点值应为5,下一个节点值为2,再下一个节点为None。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:15:36