Python带哨兵节点双向链表remove_element_at方法报错:NoneType无next属性
问题分析与修复
你的代码触发'NoneType' object has no attribute 'next'错误的核心原因是链表节点的双向链接未正确建立,导致遍历到后续节点时出现None,进而引发属性访问失败。具体问题及修复方案如下:
1. 内部类引用错误
__Node是Linked_List的私有内部类,你在append_element和insert_element_at中直接用Node(val)实例化节点会触发NameError(若外部未定义Node类),必须通过self.__Node(val)来创建内部类实例。
2. append_element方法未完整建立双向链接
当前实现仅修改了前驱节点的next和尾哨兵的prev,但未设置新节点的prev和next属性——新节点的next默认是None而非尾哨兵。当链表元素超过2个时,后续节点的next指向None,删除索引大于1的节点时,访问current.next.prev就会触发NoneType错误。
修复后的完整代码
class Linked_List: class __Node: def __init__ (self, val): self.val = val self.next = None self.prev = None def __init__(self): self.__size = 0 self.__header = self.__Node(None) self.__trailer = self.__Node(None) self.__header.next = self.__trailer self.__trailer.prev = self.__header self.__trailer.next = None self.__header.prev = None def __len__(self): return self.__size def append_element(self, val): # 修复:使用内部类实例化节点 newest = self.__Node(val) prev_node = self.__trailer.prev # 完整建立双向链接 prev_node.next = newest newest.prev = prev_node newest.next = self.__trailer self.__trailer.prev = newest self.__size += 1 def insert_element_at(self, val, index): if index < 0 or index >= self.__size: raise IndexError # 修复:使用内部类实例化节点 new_node = self.__Node(val) current = self.__header.next prev = self.__header for i in range(index): if current is None: raise IndexError prev = current current = current.next new_node.next = current new_node.prev = prev prev.next = new_node if current is not None: current.prev = new_node self.__size += 1 def remove_element_at(self, index): if index < 0 or index >= self.__size: raise IndexError current = self.__header.next for i in range(index): current = current.next # 此时current的next必然是有效节点(哨兵或其他节点),不会为None current.prev.next = current.next current.next.prev = current.prev self.__size -= 1 return current.val
验证示例
ll = Linked_List() ll.append_element(1) ll.append_element(2) ll.append_element(3) ll.append_element(4) print(len(ll)) # 输出4 print(ll.remove_element_at(2)) # 输出3 print(len(ll)) # 输出3
内容的提问来源于stack exchange,提问作者robo
相关产品推荐
相关产品推荐

