You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python中用del删除链表节点无法自动修改前一节点的next指针?

为什么删除链表最后一个节点的操作没生效?

问题重现

你创建了包含3个节点的链表,尝试用del node3或node3 = None删除最后一个节点,但打印链表时输出没有变化,实际结果和预期不符。

核心原因分析

你操作的是指向节点的引用,而非链表本身的连接结构,这涉及两个你缺失的关键概念:

  • Python的引用与对象分离:变量node3只是一个指向链表最后一个节点对象的引用,不是节点对象本身。del node3只是销毁了这个引用,不会影响链表中node2.next指向的那个节点对象;node3 = None只是让这个变量指向None,同样不会改变node2.next的指向——链表的连接关系完全没被修改,所以遍历的时候依然能访问到最后一个节点。

  • 链表的结构依赖指针连接:链表的节点是通过next指针串联起来的,要删除最后一个节点,必须修改倒数第二个节点的next指针,让它指向None,切断与最后一个节点的关联。只有这样,遍历链表时才会在倒数第二个节点后终止。

正确的实现方式

要删除链表的最后一个节点,需要先找到倒数第二个节点,然后修改它的next属性:

class node:
    def __init__(self, data):
        self.data= data
        self.next = None
    def printLL(self):
        temp = self
        while(temp):
            print(temp.data, end=" ")
            temp = temp.next
        print("None")
        print()

# 创建链表
head = node(1)
node2 = node(2)
node3 = node(3)
head.next = node2
node2.next = node3
head.printLL()

# 正确删除最后一个节点
# 找到倒数第二个节点
current = head
while current.next and current.next.next:
    current = current.next
# 将倒数第二个节点的next设为None,切断与最后一个节点的连接
current.next = None

head.printLL()

输出结果

1 2 3 None

1 2 None

这样就符合你的预期输出了,最后一个节点因为失去了所有引用(node2.next不再指向它,若没有其他变量指向它),会被Python的垃圾回收机制自动清理。

内容的提问来源于stack exchange,提问作者keshavnischal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 19:06:20