Python双向链表节点删除代码疑问:冗余行与del缺失问题
分析双向链表删除函数的疑问
首先咱们先拆解你给出的这段删除函数代码:
def remove( self, p ) : tmp = p.prev p.prev.next = p.next p.prev = tmp
关于tmp = p.prev和p.prev = tmp的作用
这里其实存在明显的问题——正常的双向链表删除节点,核心是要把节点p的前驱和后继互相链接起来,完整操作应该是两步:
- 让p的前驱节点的
next指向p的后继节点(对应代码里的p.prev.next = p.next,这一步是正确的) - 让p的后继节点的
prev指向p的前驱节点(这一步你的代码里完全缺失了!)
你代码里的tmp = p.prev是保存了p原来的前驱节点,但后面的p.prev = tmp完全是多余的——因为p的prev本来就是tmp,这行代码等于啥都没做。我怀疑这是笔误,原本应该写成p.next.prev = tmp,这样才能把后继节点的前驱指向p原来的前驱,完成双向链表的完整断链操作。
如果按你现在的代码来看,tmp = p.prev和p.prev = tmp这两行没有任何实际作用,属于无效代码。
关于是否需要添加del p
在Python里,del语句的作用是删除变量的引用,而不是直接销毁对象。对象的销毁是由Python的垃圾回收机制自动处理的,只有当没有任何引用指向这个对象时,它才会被回收。
所以要不要加del p取决于你的函数设计:
- 如果这个
remove函数的职责只是把节点p从链表中移除(断链),而调用者可能还需要使用p节点(比如插入到其他链表、读取节点数据),那绝对不能加del p,否则调用者会失去对这个节点的访问权。 - 如果你的设计要求移除节点后直接销毁它,那可以加
del p,但通常链表的remove函数只负责断链,把销毁节点的操作交给调用者会更灵活。
内容的提问来源于stack exchange,提问作者anon anon
相关产品推荐
相关产品推荐

