Python读取txt创建链表后如何正确实现头部插入新节点
故障原因
代码无法实现头部插入和txt导入逻辑无关,是三个写法错误导致的:
- 类属性命名前后不统一:
append方法操作的头节点属性是self.head,但addFirst里操作的是self.__head。Python中双下划线开头的属性会触发名称修饰机制,self.__head和之前存储txt导入数据的self.head是完全独立的两个变量,根本修改不到实际的链表头。 - 新节点初始化传参错误:创建新节点时写死了
Node(data=''),调用方法时传入的用户输入没有传给节点构造函数,就算插入位置正确,节点存储的也是空字符串。 - 长度统计逻辑缺失:原有
append方法没有同步更新链表长度计数,如果要维护长度属性,追加节点时也要同步累加长度,否则长度统计值会不准。
修正方案
统一类内所有属性的命名规则,修正节点传参逻辑即可,以下是可直接运行的修正代码:
class Node: def __init__(self, data): self.data = data self.next = None class LinkedList: def __init__(self): self.head = None self.size = 0 def append(self, data=''): new_node = Node(data) if self.head is None: self.head = new_node self.size += 1 return last = self.head while last.next: last = last.next last.next = new_node self.size += 1 def addFirst(self, data=''): newNode = Node(data) newNode.next = self.head self.head = newNode self.size += 1 # 原有txt导入逻辑无需修改 linked_list = LinkedList() with open('All Equipment.txt', 'r') as f: for line in f: linked_list.append(line.strip()) # 调用头部插入 Info = input('Enter your data: ') linked_list.addFirst(Info)
如果你偏好使用双下划线开头的私有属性,只需要把类初始化、
append方法里所有的self.head、self.size全部替换为self.__head、self.__size即可,核心要求是类内部所有操作引用的属性名必须完全一致,不能混用公有、私有命名。
内容的提问来源于stack exchange,提问作者Samir
相关产品推荐
相关产品推荐

