繁体   English   中英

学习使用链表在python 3中实现队列

[英]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.lastbody 就像评论说的那样,当body.node = self.last执行时,新的节点对象将递归地附加到self.first.node上,以便在三个入队调用之后,我得到一个看起来像这样的对象: self.first.node.node

每个节点都包含适当的数据值,我可以使用出队方法简单地从队列中读取它们。 (快乐的时光)。

问题是我无法找出原因。 我看不到body是如何通过编程方式链接到self.first

你能解释一下吗?

body只是对self.last的引用-这是分配( body = self.last )发生的唯一位置。 这通常具有名称tmpold_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 ,请尝试。 在第一时间将设置firstNone (这不是一个Node ),和第二将打破,因为None不具有data成员。

总体而言,实施存在缺陷-我会重做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM