我正在尝试使用节点容器(对象)实现链接的队列。我的代码如下。正如您可以看到的那样,当出于某种原因出队时,第二个值将被跳过。可能在某处存在缺陷。我发现很难掌握对象究竟发生了什么。请帮忙!
代码:
# Queue FIFO as a container of Nodes(objects)
class Node(object):
def __init__(self, value):
self.value = value
self.next = None
class LinkedQueue(object):
def __init__(self):
self.front = None
self.back = None
def dequeue(self):
#print self.front.__dict__, self.front.next
if self.front:
value = self.front.value
self.front = self.front.next
return value
raise Exception('Queue Empty! Cannot dequeue')
def enqueue(self, value):
node = Node(value)
if self.front:
self.front.next = node
else:
self.front = node
self.back = node
if not self.front is None:
print 'BACK: ', self.back.__dict__, self.back.next
print 'FRONT: ', self.front.__dict__, self.front.next
return True
if __name__ == '__main__':
queue = LinkedQueue()
queue.enqueue(11)
queue.enqueue(10)
queue.enqueue(9)
print
print
print queue.dequeue()
print queue.dequeue()
输出:
BACK: {'value': 11, 'next': None} None
FRONT: {'value': 11, 'next': None} None
BACK: {'value': 10, 'next': None} None
FRONT: {'value': 11, 'next': <__main__.Node object at 0x1048cdb10>} <__main__.Node object at 0x1048cdb10>
BACK: {'value': 9, 'next': None} None
FRONT: {'value': 11, 'next': <__main__.Node object at 0x1048cdb50>} <__main__.Node object at 0x1048cdb50>
11
9
答案 0 :(得分:1)
在enqueue
函数中,此段代码看起来很可疑。
if self.front:
self.front.next = node
每次调用enqueue
函数时,代码的上述部分都将覆盖第二个节点。
(self.front
似乎没有改变任何地方)
答案 1 :(得分:1)
正如哈里所写,你的入队功能存在问题。
if self.front:
self.front.next = node
应该有BACK引用,例如:
if self.front:
self.back.next = node
因为您需要将其附加到队列的末尾。现在应该可以了。