菜单

链表

相关源文件

目的与范围

本文档涵盖了 TheAlgorithms/Python 存储库中的链表数据结构实现。链表是基本的线性数据结构,由通过指针连接的节点组成,提供动态内存分配以及高效的插入/删除操作。该存储库包含多种链表变体,包括单向、双向和循环实现,以及用于常见操作的专用实用函数。

有关堆栈和队列等其他线性数据结构的信息,请参阅 堆栈、队列和线性结构。有关基于树的链式结构,请参阅 树和基于树的结构

核心链表架构

来源: data_structures/linked_list/singly_linked_list.py8-38 data_structures/linked_list/doubly_linked_list.py6-20 data_structures/linked_list/circular_linked_list.py8-17

单向链表实现

主要的单向链表实现通过 LinkedList 类和包含数据和下一个指针的 Node 对象提供了一套完整的操作。

节点结构

来源: data_structures/linked_list/singly_linked_list.py8-24 data_structures/linked_list/singly_linked_list.py40-48

核心操作

操作方法时间复杂度描述
在头部插入insert_head(data)O(1)在开头添加节点
在尾部插入insert_tail(data)O(n)在末尾添加节点
在指定位置插入insert_nth(index, data)O(n)在指定索引处插入
删除头部delete_head()O(1)删除第一个节点
删除尾部delete_tail()O(n)删除最后一个节点
按位置删除delete_nth(index)O(n)删除索引处的节点
反转reverse()O(n)反转整个链表
获取长度__len__()O(n)计数节点

来源: data_structures/linked_list/singly_linked_list.py176-190 data_structures/linked_list/singly_linked_list.py192-221 data_structures/linked_list/singly_linked_list.py235-287 data_structures/linked_list/singly_linked_list.py337-363

迭代和索引支持

LinkedList 类实现了 Python 的迭代器协议和索引操作。

来源: data_structures/linked_list/singly_linked_list.py50-67 data_structures/linked_list/singly_linked_list.py108-130 data_structures/linked_list/singly_linked_list.py133-158 data_structures/linked_list/singly_linked_list.py69-88 data_structures/linked_list/singly_linked_list.py90-106

双向链表实现

双向链表通过包含 nextprevious 指针的节点提供双向遍历。

节点结构

来源: data_structures/linked_list/doubly_linked_list.py6-14 data_structures/linked_list/doubly_linked_list.py16-20

操作

DoublyLinkedList 类提供了针对双向访问优化的操作。

方法功能性关键实现细节
insert_at_head(data)在开头插入更新旧头节点的 previous 指针
insert_at_tail(data)在末尾插入更新旧尾节点的 next 指针
insert_at_nth(index, data)在指定位置插入维护前向和后向链接
delete_head()删除第一个节点将头节点的 previous 更新为 None
delete_tail()删除最后一个节点将尾节点的 next 更新为 None
delete_at_nth(index)按位置删除重新连接 previous.nextnext.previous

来源: data_structures/linked_list/doubly_linked_list.py56-106 data_structures/linked_list/doubly_linked_list.py108-157

循环链表实现

循环链表实现将尾节点连接回头节点,形成一个环。

结构与操作

来源: data_structures/linked_list/circular_linked_list.py15-17 data_structures/linked_list/circular_linked_list.py58-87 data_structures/linked_list/circular_linked_list.py107-140 data_structures/linked_list/circular_linked_list.py19-30

循环结构在插入和删除时需要特殊处理,以维护循环属性,其中 tail.next_node 始终指向 head

特殊的链表操作

环检测

来源: data_structures/linked_list/has_loop.py6-8 data_structures/linked_list/has_loop.py25-43 data_structures/linked_list/has_loop.py15-23

节点交换

swap_nodes 功能根据数据内容在两个节点之间交换数据值

步骤实现代码参考
1. 查找 node_1从头部开始遍历,直到 node.data == node_data_1data_structures/linked_list/swap_nodes.py122-124
2. 查找 node_2从头部开始遍历,直到 node.data == node_data_2data_structures/linked_list/swap_nodes.py125-127
3. 验证节点如果任一节点为 None,则提前返回data_structures/linked_list/swap_nodes.py128-129
4. 交换数据交换 node_1.datanode_2.datadata_structures/linked_list/swap_nodes.py131

来源: data_structures/linked_list/swap_nodes.py67-131

中间元素检测

来源: data_structures/linked_list/middle_element_of_linked_list.py20-60 data_structures/linked_list/middle_element_of_linked_list.py51-57

列表合并

merge_lists 函数将两个 SortedLinkedList 实例合并

来源: data_structures/linked_list/merge_two_lists.py62-75 data_structures/linked_list/merge_two_lists.py20-24

用法模式和集成

工厂函数

该存储库提供用于从序列创建链表的工厂函数

功能模块目的
make_linked_list(elements_list)from_sequence.py从序列创建基本链表
make_linked_list(elements_list)print_reverse.py创建具有扩展功能的 LinkedList
SortedLinkedList(ints)merge_two_lists.py从整数创建排序链表

来源: data_structures/linked_list/from_sequence.py21-36 data_structures/linked_list/print_reverse.py88-107 data_structures/linked_list/merge_two_lists.py20-24

测试与验证

所有链表实现都包含全面的文档测试和测试函数

来源: data_structures/linked_list/singly_linked_list.py366-409 data_structures/linked_list/doubly_linked_list.py191-225 data_structures/linked_list/circular_linked_list.py151-205

链表实现展示了清晰的关注点分离、全面的错误处理,以及与 Python 内置的迭代和索引协议的集成,使其既具有教育意义,又在算法应用中实用。