Python链表元素删除函数运行触发AttributeError问题排查
链表remove函数AttributeError报错解决方案
报错原因
该报错本质是代码访问了对象不存在的属性,结合这段remove函数的逻辑,常见触发原因有两类:
- 链表节点类定义不匹配:你自定义的链表节点类没有名为
val或者next的属性,比如属性名被定义为value、next_node等其他名称,访问curr.val、prev.next时就会触发属性不存在的报错。 - 入参或链表结构非法:传入的
head不是合法的链表节点实例(比如传了整数、字符串等其他类型的对象),或者链表中某个节点的next属性指向了非节点、非空的其他类型对象,循环中访问curr.val时就会触发报错。
注:你提供的
remove函数本身逻辑是正确的,不存在空指针访问属性的问题:代码中仅在prev不为空的前提下才会访问prev.next,不会出现空对象调用属性的情况。
修复方案
- 对齐链表节点属性名
首先确认你的链表节点类定义和函数中访问的属性名一致,标准的链表节点定义参考如下:
class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next
如果你的节点属性名自定义为其他值,对应修改remove函数中的属性访问语句即可,比如属性名为value就把所有curr.val改为curr.value。
- 增加入参校验(可选)
可以在函数开头增加简单的合法性校验,提前抛出明确的错误提示,方便定位问题:
def remove (head,val): # 新增入参校验逻辑 if head is not None: if not hasattr(head, 'val') or not hasattr(head, 'next'): raise TypeError("入参head不是合法的链表节点对象") prev,curr=None,head while curr: if curr.val==val: if prev: prev.next=curr.next else: head=curr.next curr=curr.next else: prev,curr=curr,curr.next return head
- 校验链表结构
检查你构建的链表,确保每个节点的next属性仅赋值为None或者另一个合法的链表节点实例,不要赋值其他类型的对象。
内容的提问来源于stack exchange,提问作者Rishabh Sharma
相关产品推荐
相关产品推荐

