Python链表insertAfter方法报错:'str'对象无'next'属性
错误根源拆解
先看看你遇到的报错栈:
Traceback (most recent call last):
File "C:/Users/Admin/PycharmProjects/LinkedListIntro/IntroToLinkedList.py", line 94, in
list.insertAfter(prevNode,newData)
File "C:/Users/Admin/PycharmProjects/LinkedListIntro/IntroToLinkedList.py", line 29, in insertAfter
newNode.next = prevNode.next
AttributeError: 'str' object has no attribute 'next'
这个问题本质是参数类型不匹配:
你的insertAfter方法设计时,第一个参数prevNode需要接收一个Node类的实例对象(因为要访问它的next属性来完成插入逻辑),但在菜单选项4的代码里,你直接把input()获取的字符串(比如用户输入的"iluvu")传了进去。字符串类型根本没有next属性,自然就触发了这个报错。
修复方案
我们需要先根据用户输入的节点数据,在链表中找到对应的Node对象,再把这个对象传给insertAfter方法。具体分两步:
1. 给LinkedList类添加节点查找方法
在LinkedList类中新增一个根据数据值查找节点的方法,帮我们把用户输入的字符串转换成对应的节点对象:
def find_node_by_data(self, data): current = self.head while current: if current.data == data: return current current = current.next # 找不到对应节点时返回None return None
2. 修改菜单选项4的逻辑
不再直接传递用户输入的字符串,而是先调用上面的查找方法拿到节点对象,再执行插入:
elif menu == 4: prev_node_data = input("Add an element to insert after[Previous Node]: ") newData = input("Add an element to insert after[New Data]: ") # 先找到对应的节点对象 prevNode = list.find_node_by_data(prev_node_data) if prevNode is None: print(f"Node with data '{prev_node_data}' not found in the list!") else: list.insertAfter(prevNode, newData)
完整修改后的关键代码片段
class LinkedList: # ... 保留原有所有方法 ... def find_node_by_data(self, data): current = self.head while current: if current.data == data: return current current = current.next return None if __name__ == '__main__': list = LinkedList() while True: # ... 保留原有菜单打印逻辑 ... elif menu == 4: prev_node_data = input("Add an element to insert after[Previous Node]: ") newData = input("Add an element to insert after[New Data]: ") prevNode = list.find_node_by_data(prev_node_data) if prevNode is None: print(f"Node with data '{prev_node_data}' not found in the list!") else: list.insertAfter(prevNode, newData) # ... 保留其他菜单逻辑 ...
验证效果
现在再测试菜单4:输入已存在的节点数据(比如"iluvu"),程序会自动找到对应的Node对象并完成插入,不会再触发AttributeError;如果输入的节点数据不存在,还会给出友好的提示信息。
内容的提问来源于stack exchange,提问作者AdmiralDugong

