Python读取txt数据存入链表逆序输出及节点增删问题咨询
问题原因
你当前使用的是头插法构建链表:每读取一行文本,就把新生成的节点设为新的头节点,指向之前的旧链表。最先读取的文件第一行会被后续插入的节点不断挤到链表尾部,最后从head开始遍历的时候,自然会从最后插入的文件最后一行开始输出,呈现逆序效果。
这种构建方式本身不会破坏链表的结构逻辑,不会影响后续增删节点操作的正确性,只是链表存储的内容顺序和文件原始顺序相反,如果业务要求存储顺序和文件一致,调整构建逻辑即可。
修正方案
两种常用的链表构建方式适配不同场景,你可以按需选择:
方法1:尾插法(存储顺序和文件原顺序一致,适配当前需求)
尾插法每次把新节点接在当前链表的尾部,额外维护一个尾指针就能避免每次插入都从头遍历找尾,插入效率和头插法一致,都是O(1)时间复杂度,实现代码如下:
# 按照PEP8规范,类名建议使用大驼峰命名 class Node: def __init__(self, data='', next=None): self.data = data self.next = next head = None tail = None # 维护尾指针,记录当前链表最后一个节点的位置 with open('All Equipment.txt', 'r', encoding='utf-8') as f: for line in f: new_node = Node(line.strip()) if head is None: # 空链表场景下,第一个节点同时是头节点和尾节点 head = new_node tail = new_node else: # 新节点接在尾节点后方,更新尾指针位置 tail.next = new_node tail = new_node # 遍历验证,输出顺序和文件行顺序完全一致 current = head while current is not None: print(current.data) current = current.next
方法2:保留头插法,构建完成后逆序链表(适配栈类业务场景)
如果你后续需要“后进先出”的栈式操作,头插法本身效率极高(插入、删除头部节点都是O(1)时间),不需要修改构建逻辑,只需要在需要正序输出/操作前,把链表做一次逆序即可:
def reverse_linked_list(head): prev = None current = head while current is not None: next_node = current.next current.next = prev prev = current current = next_node return prev # 头插法构建完逆序链表后,调用方法得到正序链表 head = reverse_linked_list(head)
拓展知识点
- 链表操作注意事项:
- 头节点的增删不需要遍历找前驱节点,直接操作
head指针即可,时间复杂度O(1) - 中间、尾部节点的增删,必须先定位到目标位置的前驱节点,才能修改
next指针完成操作,平均时间复杂度O(n) - 写增删逻辑时一定要覆盖边界场景:空链表、仅含单个节点的链表、操作目标是头/尾节点,避免出现断链、空对象引用报错
- 头节点的增删不需要遍历找前驱节点,直接操作
- 文件读取建议:打开文件时显式指定
encoding参数(比如encoding='utf-8'),避免不同操作系统默认编码不一致导致中文乱码。 - 工程实践提示:600行这个数据规模下,Python内置的
list结构性能远高于手写链表,日常开发如果没有特殊的算法练习需求,直接用列表存储文本行即可,增删改查的接口更简单,性能也更好。手写链表更适合作为数据结构入门的练习场景。 - 头插法的典型适用场景是实现栈结构,栈顶对应链表头,入栈、出栈操作都只需要修改头指针,效率极高。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

