教程复制的Python链表remove函数失效,指针修改逻辑疑问
问题解答
1. remove方法失效原因
你遇到的问题是缩进错误导致的,属于代码编写时的低级失误,和删除逻辑本身无关。
原代码中return False的缩进层级是在while循环内部,这会导致:
第一次循环判断根节点(值为12)和待删除值8不相等后,执行完指针后移逻辑就会直接返回False,整个循环仅执行1次,根本不会遍历到存储8的第二个节点,自然不会执行self.size -=1的逻辑。
正确的写法是将return False调整到和while同级,也就是整个循环遍历完所有节点都没找到目标值时,才返回False:
def remove(self, d): this_node = self.root prev_node = None while this_node is not None: if this_node.data == d: if prev_node is not None: prev_node.next_node = this_node.next_node else: self.root = this_node.next_node self.size -=1 return True else: prev_node = this_node this_node = this_node.next_node # 注意return False的缩进位置,和while对齐 return False
修改后执行删除8的操作,size就会正常变为2。
2. next_node的引用逻辑
next_node是Node类的内置实例属性,不需要在remove方法中额外赋值:
- 定义
Node类的__init__方法时,就已经声明了next_node属性,用于存储当前节点指向的下一个节点的引用。 - 调用
add()方法添加节点时,创建新Node实例会直接把当前链表的root作为next_node参数传入,节点加入链表的同时就完成了后继关系的绑定,所有节点的next_node属性在添加时就已经完成赋值。 - 遍历链表时只需要顺着已经绑定好的
next_node指针逐个访问即可,不需要在遍历/删除方法中重复赋值。
内容的提问来源于stack exchange,提问作者Geomatrix Gamer
相关产品推荐
相关产品推荐

