Python循环单链表调用delete_entire方法报NoneType无value属性错误
问题原因及解决方案
错误原因
__iter__方法未处理空链表场景:删除整个链表后self.head被赋值为None,迭代器没有做空判断,直接将None作为节点返回,列表推导式访问node.value时触发属性错误。delete_entire方法执行顺序存在隐患:原代码先将self.head置为None再修改self.tail.next,如果调用该方法时链表本身为空,self.tail本身就是None,访问self.tail.next会直接触发报错。- 额外笔误:代码中打印语句的迭代对象写为
call,和实际定义的链表变量名cll不符,会触发名称错误。
修复方案
1. 修正__iter__方法
添加空链表判断,空链表直接终止迭代,不会返回任何节点:
def __iter__(self): if self.head is None: return node = self.head while True: yield node if node.next is self.head: break node = node.next
2. 修正delete_entire方法
调整执行顺序,先清除循环引用再置空头尾指针,兼容空链表调用场景:
def delete_entire(self): if self.tail is not None: self.tail.next = None self.head = None self.tail = None
3. 修正变量名拼写
将打印语句中的call改为cll。
修改后调用删除方法再打印,会直接返回预期的空列表[]。
内容的提问来源于stack exchange,提问作者Malay Jeena
相关产品推荐
相关产品推荐

