所以我有这个代码,它正在使用它当前的形状,它是一个任务,但感觉我们没有人真正理解它是如何工作的,我真的想要一个答案,因为感觉就像我每次上课一样,这也困扰着我。 代码:
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?感谢任何帮助,
答案 0 :(得分:1)
以空q
开头是有帮助的。在这种情况下,q.svans
和q.huvud
都是None
,在您致电q.put(1)
之前。当您通过创建包含1:
Node
对象进行调用时,您可以进行调整
item.cargo = 1
item.pekareinnan = None
现在,从q.svans is None
开始(使用is
与None
进行比较,而不是==
),
我们将q.huvud
和q.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的节点,所以它被有效删除;它最终将被垃圾收集。