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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:09:30