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
相关产品推荐
相关产品推荐

