类节点和类队列,"指针"工作?

时间:2016-06-27 23:36:57

标签: class python-3.x nodes

所以我有这个代码,它正在使用它当前的形状,它是一个任务,但感觉我们没有人真正理解它是如何工作的,我真的想要一个答案,因为感觉就像我每次上课一样,这也困扰着我。 代码:

class Node:
    def __init__(self,data):
        self.cargo=data
        self.pekareinnan=None

class Queue:
    def __init__(self):
        self.svans=None
        self.huvud=None

    def put(self,x):
        item=Node(x)
        if self.svans==None:
            self.svans=item
            self.huvud=item
        else:
            self.svans.pekareinnan=item   #What does this line really do?
            self.svans=item

    def isempty(self):
        return self.huvud==None

    def get(self):
        if self.huvud==None:
            return None
        else:
            do=self.huvud.cargo
            self.huvud=self.huvud.pekareinnan ##How does this line work?
            return do

如果紧随其后,pekareinnan = pointerbefore(瑞典语),svans = tail,huvud = head。我试过问那些比我更了解编程的人,其中一人说svans是一个哨兵。让我们说我有一个1,3和5的列表。我想把9放在那里,什么是pekareinnan,什么是svans?感谢任何帮助,

1 个答案:

答案 0 :(得分:1)

以空q开头是有帮助的。在这种情况下,q.svansq.huvud都是None,在您致电q.put(1)之前。当您通过创建包含1:

的新Node对象进行调用时,您可以进行调整
item.cargo = 1
item.pekareinnan = None

现在,从q.svans is None开始(使用isNone进行比较,而不是==), 我们将q.huvudq.svans都设置为item,以便同一节点作为列表的头部和尾部。

                      item
                        |
                        V
q.huvud ----->  +-----------+------+
                |     1     | None |
q.svans ----->  +-----------+------+

当我们致电q.put(3)时,我们只需将q.huvud单独添加到列表末尾即可添加3,但更新旧尾部的pekareinnan,然后q.svans

首先,创建新节点:

                                                 item
                                                   |
                                                   V
q.huvud ----->  +-----------+------+  +------------+------+
                |     1     | None |  |      3     | None |
q.svans ----->  +-----------+------+  +------------+------+

接下来,使用q.svans.pekareinnan = item

将其链接到现有列表
                                                 item
                                                   |
                                                   V
q.huvud ----->  +-----------+------+  +------------+------+
                |     1     |  * --+->|      3     | None |
q.svans ----->  +-----------+------+  +------------+------+

然后通过设置q.svans = item

来更新队列本身
                                                 item
                                                   |
                                                   V
q.huvud ----->  +-----------+------+  +------------+------+
                |     1     |  * --+->|      3     | None |
q.svans         +-----------+------+  +------------+------+
   |                                         ^
   |                                         |
   +------------------------------------------

添加5和9时会发生同样的情况:您分配一个新节点,将现有 pekareinnan的{​​{1}}设置为新节点,然后设置{{ 1}}也适用于新节点。

要删除项目,我们会执行相同的操作,但使用q.svans。请注意,q.svans是指向第一个节点的唯一指针,因此在更新q.huvud以删除节点之前,我们需要记住货物是什么。

q.huvud

现在我们可以通过简单地用跟随它的节点覆盖q.huvud来删除头部。

 cargo = q.huvud.cargo #   1


q.huvud ----->  +-----------+------+  +------------+------+
                |     1     |  * --+->|      3     | None |
q.svans         +-----------+------+  +------------+------+
   |                                         ^
   |                                         |
   +------------------------------------------

因为没有任何内容指向包含1的节点,所以它被有效删除;它最终将被垃圾收集。