Python中使用next删除链表尾节点触发NoneType无nxt属性报错如何解决
问题原因分析
核心错误1:循环次数计算错误
你当前的循环逻辑是遍历self.size-1次,这会导致before最终指向最后一个节点而非最后一个节点的前驱节点:
- 举个例子:链表长度为3(节点顺序A→B→C),你需要的前驱是B,只需要从head(A)出发走1次即可,对应循环次数应该是
self.size - 2次 - 按你现有逻辑走3-1=2次,最终
before会指向最后一个节点C,此时before.nxt就是None,赋值给delete后访问delete.nxt就会触发属性不存在的报错
核心错误2:未处理长度为1的边界场景
当链表只有1个节点时,self.size=1,range(self.size-1)等价于range(0),循环不会执行,before直接指向唯一的head节点,此时before.nxt还是None,同样会触发上述报错。
其他隐藏问题
- 返回值错误:你当前返回的是前驱节点
before的value,应该返回被删除节点delete的value才符合remove_last的语义 - 未维护tail指针:你定义了tail属性,但删除最后一个节点后没有更新tail为新的最后一个节点,后续访问tail会拿到已删除的旧节点
- 删除最后一个节点后没有处理空链表状态:当删除唯一节点后,需要把head和tail都置为None
修正后的代码示例
from dataclasses import dataclass from typing import Any @dataclass class Node: value: int = None nxt: Any = None @dataclass class Deque: head: Node = None tail: Node = None size: int = 0 def remove_last(self): if self.size == 0: print("empty queue") return None # 处理长度为1的边界 if self.size == 1: delete_val = self.head.value self.head = None self.tail = None self.size -= 1 return delete_val # 找最后一个节点的前驱,循环size-2次 before = self.head for i in range(self.size - 2): before = before.nxt delete = before.nxt delete_val = delete.value before.nxt = None # 更新tail self.tail = before self.size -= 1 return delete_val
内容的提问来源于stack exchange,提问作者Edenco
相关产品推荐
相关产品推荐

