[英]Learning to implement a queue in python 3 using a linked list
我已经为此苦苦挣扎了好一阵子。 我已经使用链表实现了一个队列。 它工作正常,但我不知道为什么。 我改编了Java示例中的enqueue方法,但无法弄清楚它为什么起作用。
class Node:
def __init__(self, data):
self.data = data
self.node= None
class Queue:
def __init__(self):
self.first = Node(None)
self.last = Node(None)
self.n = 0
def enqueue(self, data):
body = self.last
self.last = Node(data) # this is a new node
if self.is_empty():
self.first = self.last
else:
body.node = self.last # this adds body.node to self.first.node recursively ???? How is body node and self.first.node linked?
self.n += 1
def dequeue(self):
result = self.first.data
self.first = self.first.node
self.n -= 1
return result
def is_empty(self):
return self.n == 0
问题是入队方法。 我对body变量感到困惑。 我已经通过pycharm调试器运行了代码,并仔细跟踪了三个节点变量self.first
self.last
和body
。 就像评论说的那样,当body.node = self.last
执行时,新的节点对象将递归地附加到self.first.node上,以便在三个入队调用之后,我得到一个看起来像这样的对象: self.first.node.node
。
每个节点都包含适当的数据值,我可以使用出队方法简单地从队列中读取它们。 (快乐的时光)。
问题是我无法找出原因。 我看不到body
是如何通过编程方式链接到self.first
。
你能解释一下吗?
body
只是对self.last
的引用-这是分配( body = self.last
)发生的唯一位置。 这通常具有名称tmp
或old_last
等。
您需self.last
因为self.last
不再引用队列中的最后一个节点,因为self.last = Node(data)
。 现在,因为body
是老最后 ,它的节点值是None
(这是必须是真实的一种不变-检查)。 由于我们不希望它持续到最后,因此将其设置为我们创建的新节点-很好地由我们刚刚重新分配的self.last
引用。 这就是为什么body.node = self.last
是正确的原因- 旧的最后一个节点现在指向新的最后一个节点(根据需要,它指向None
)。
这里没有递归的内容-只是一个临时变量,该变量保存了对旧变量的引用。
当队列为空时,您将获得:
self.first = self.last
这是首次初始化节点(入队)的位置。 请注意,这意味着您有一个小错误 ,您在__init__
丢失了对第一个Node(None)
的第一个引用,实际上是其他语言中的“内存泄漏”,但是在Python中却无关紧要。
真正的错误是,如果您两次使新dequeue
,请尝试。 在第一时间将设置first
到None
(这不是一个Node
),和第二将打破,因为None
不具有data
成员。
总体而言,实施存在缺陷-我会重做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.