我在分析一个删除节点的双链表函数。然而,我有点困惑。
def remove( self, p ) :
tmp = p.prev
p.prev.next = p.next
p.prev = tmp
为什么有一个tmp=p.prev和p.prev=tmp。这些额外线路的用途是什么?最后,为什么没有使用“del”删除节点?代码末尾不应该是“delp”吗?
非常感谢。
首先,如果这是整个函数,那么它是错误的,这可能是您理解它有困难的部分原因。
要从双向链表中删除节点,您需要做三件事:
p
节点。因为Python是垃圾收集的,所以步骤3会自动发生。
步骤1由p.prev.next=p.next
处理。
但第二步在任何地方都不会发生<代码>下一页。prev仍然指向p
,而不是p.prev
。这意味着如果你向前走列表,p
将不属于它,但如果你向后走,它将属于它。所以p
实际上并没有被删除。
与此同时,tmp=p.prev
后面跟着p.prev=tmp
没有做任何有用的事情。3而且,无论它试图做什么,你几乎永远不需要tmp
这样的在Python中,你可以用x, y=y, x
代替tmp=x; x=y; y=tmp
交换值。
所以,你真正想要的是:
def remove(self, p):
p.prev.next = p.next
p.next.prev = p.prev
1。您可能正在使用的Python引用解释器CPython通过自动引用计数进行垃圾收集,偶尔会运行一个循环中断器。这是否算作“真正的”垃圾收集是一个很好的圣战论据,但在这里并不重要
<子>2.您只需要删除对对象的所有引用,它就会变成垃圾并自动清理。因此,您需要删除下一个和上一个节点对p
的引用,这是您已经在做的。你需要让p
消失,但是你不需要del p
-它是一个局部变量;当你从函数返回时,它就消失了。之后,由的调用者删除
;如果他们不保留对节点的任何引用,节点就是垃圾。
3。如果我们临时为p.prev
指定一个不同的值,并希望在函数结束时恢复它,那么它可以做一些有用的事情。但这并没有发生在这里,我不认为写这段代码的人有这样的意图;我想他们想做些交换
我试图初始化一个双链接列表,其中包含另一个双链接列表中的虚拟节点(也包含虚拟节点)。例如,学生列表中的一个节点有许多朋友存储在该节点内的链接列表中。这是我的代码: 当我试图编译它时,它告诉我:警告:来自不兼容指针类型的赋值。它出现在我发表评论的台词上。请帮忙^^ 编辑:谢谢鸭嘴兽!
我目前无法获得双链接列表的反向函数来正确处理作业,我已经阅读了其他线程并在谷歌上搜索,但通常不同的是,我的问题以常量传递,它返回一个“dlist”。教授提供了一个“代码测试仪”,它说我的代码在执行“反向(反向(dlist c))”时,并不等于它本身就是“c”。[反转两次并不等于它本身]。 dlist类是: 这是反向函数: 每个数据列表节点都有一个指向前一个节点的指针和一个指向下一个节点的指针。dl
我正在尝试创建二维双链接圆形阵列,从txt文件读取数据并自动创建节点。我的程序正在正确地读取第一行,但当它到达下一行并开始创建下一个节点时,会出现空指针。我不明白为什么会这样,请帮帮我。 这些都是错误。Null指针在尝试创建第二个节点时发生。它正确地创建第一个节点,而不是紧接着创建空指针。 第77行=位置next=n; 第69行=插入后(head.prev, x); 第18行=mList。镶片(k
我已经得到了实现双向链表的框架。我被PushFront()方法难住了。方法应该将提供的元素添加到链表的前面,并且应该将地址返回到新的头节点。我对如何访问列表的当前头部感到困惑,以便我可以将其分配给pNext指针。到目前为止,PushTop()方法看起来是这样的: 元素类构造函数: 数据类: 主要: 我的理解是,您通常会在调用PushFron()时提供头的地址,但是因为我没有提供,我不确定如何访问它
给定单链接列表:
我必须实现类"DoubleChainedList"和"Elem"。DoubleChainedList管理一个双链列表,Elem是关联的节点类,指针指向后继节点和前驱节点。 我必须实施以下方法: public void removeAtIndex(int i)//删除位置i处的元素 public int[]toArray()//将列表作为数组返回 双链列表 要素: 我的问题:它显示了以下错误:hea