1

我似乎无法让我的len函数工作,我一直在尝试大量的东西,但我是一个完整的初学者,所以我很确定我错过了一些完全明显的东西。这是我的代码...

 def __len__(self):
    if self.head is None:
        return 0
    else:
        return self.size

我背后的想法很简单。如果双向链表的头部为None,那么它必须为空所以返回0,否则,只返回链表的大小。

但是,我得到一个断言错误说......

AssertionError: List should contain 1 element, but length is 0

任何帮助表示赞赏,在此先感谢。

编辑:这是运行我的功能的代码...

testList.add(14)
assert len(testList) == 1, "List should contain 1 element, but length is %r" % len(testList)

EDIT2:这是我的添加功能,我很确定它是对的,我花了 2 个小时在上面...

def add(self, value):
    newNode = DoubleListNode(value)
    if self.head is None:
        self.head = newNode
        self.tail  = newNode
        newNode.prev = None
        newNode.next = None
        return newNode
    elif value < self.head.data:
        self.head = newNode
        newNode.next = self.head
        newNode.prev = None
        return newNode
    elif value > self.tail.data:
        self.tail = newNode
        newNode.prev = self.tail
        newNode.next = None
        return newNode
    else:
        node = self.head
        node2 = node
        while node is not None and node.data < value :
            node = node.next
            node2 = node.prev
        newNode.next = node.prev
        newNode.prev = node2.next
        return newNode
4

1 回答 1

1

你的add函数没有任何会增加的东西self.size。所以它是你设置的任何内容__init__,大概是0.

因此,当列表实际上为空时,__len__返回0因为self.headis None

添加元素后,它仍然返回0,因为self.sizeis 0


此外,您的代码中至少还有一个其他问题。看这个:

elif value > self.tail.data:
    self.tail = newNode
    newNode.prev = self.tail
    newNode.next = None
    return newNode

显然,newNode.prev最终会指向自己,而不是之前的尾巴。

有很多东西可以帮助判断代码的正确性——单元测试、没有工作过的人的代码审查、使用交互式可视化工具逐步完成代码、正式的证明等等——但是你工作的小时数它不是那些事情之一。

于 2013-03-29T01:20:55.757 回答