我目前正在学习Python中的链表并解决这样的任务
给定一个链表的头,反转它并返回反向链表的头。
class Node:
def __init__(self, link=None, val=None):
self.val = val
self.next = link
def reverseLL(head):
reversed_head = Node()
### MY CODE
reversed_head.val = head.next.val
reversed_head.next = head
###
return reversed_head
node2 = Node(None, 5)
node1 = Node(node2, 2)
# check that your code works correctly on provided example
assert reverseLL(node1) == Node(node1, 5), 'Wrong answer'
当我在本地尝试函数时,我只是得到错误的答案。但是当我通过一些在线评分检查运行代码时,它输出:
RuntimeErrorElement(RuntimeError,Error on line 12:
reversed_head.val = head.next.val
AttributeError: 'NoneType' object has no attribute 'next'
正如我在这个任务中所理解的,我只需要为reversed_head和link分配头部的值。我做错了什么?
不考虑如何反转列表,我可以确保您的assert
总是失败。为什么?
考虑这篇文章在哪里为对象相等(' == ')定义的默认行为?
总而言之,当定义一个类时,它的两个实例node_a之间的操作符==
和node_b将大致执行node_a is node_b
。is
比较对象的地址,而不是它们的值。
因此,由于您没有覆盖默认的__eq__
,因此两个Node
之间的比较执行is
。
现在在断言中,将函数的结果与新创建的Node(node1, 5)
进行比较。在任何情况下,对象是两个不同的实体,可以共享相同的值。但是作为不同的实体,对它们执行is
操作的结果总是false。