菜单

数据结构

相关源文件

本页面介绍了 TheAlgorithms/Python 仓库中基本数据结构的实现。这些实现注重教育清晰性,同时保持功能正确性,提供了抽象数据结构如何在 Python 中实现的具体示例。

这些数据结构是整个仓库中算法的基础组件。有关利用这些结构的算法实现,请参见第 3 页。

概述

数据结构实现架构

核心数据结构类和操作

来源

链表

链表是一种线性数据结构,其中元素存储在节点中,每个节点指向序列中的下一个节点。与数组不同,链表不需要连续的内存分配。

节点结构

仓库中的所有链表实现都使用一个包含以下内容的 Node 类:

  • data: 节点中存储的值
  • 对其他节点(next_nodeprevious 等)的引用

来源

单向链表

单向链表是最简单的链表形式,其中每个节点包含数据和指向下一个节点的引用。

关键操作

  • insert_head(data): 在开头插入 (O(1))
  • insert_tail(data): 在末尾插入(带尾指针时为 O(1))
  • insert_nth(index, data): 在指定位置插入 (O(n))
  • delete_head(): 从开头移除 (O(1))
  • delete_tail(): 从末尾移除 (O(n))
  • delete_nth(index): 从指定位置移除 (O(n))
  • reverse(): 反转列表 (O(n))

该实现还支持 Python 的内置操作

  • len(linked_list): 获取列表长度
  • for item in linked_list: 遍历列表
  • str(linked_list): 字符串表示

来源

双向链表

双向链表通过添加对前一个节点的引用来扩展单向链表,从而允许双向遍历。

关键操作

  • insert_at_head(data): 在开头插入
  • insert_at_tail(data): 在末尾插入
  • insert_at_nth(index, data): 在指定位置插入
  • delete_head(): 从开头移除
  • delete_tail(): 从末尾移除
  • delete_at_nth(index): 从指定位置移除
  • delete(data): 移除具有指定数据的第一个节点

DoublyLinkedList 类维护 headtail 指针,以便在列表两端进行高效操作。

来源

循环链表

循环链表是一种变体,其中最后一个节点指向第一个节点,形成一个环。

关键操作

  • insert_head(data): 在开头插入
  • insert_tail(data): 在末尾插入
  • insert_nth(index, data): 在指定位置插入
  • delete_front(): 从开头移除
  • delete_tail(): 从末尾移除
  • delete_nth(index): 从指定位置移除

CircularLinkedList 类维护 headtail 指针,其实现确保 tail.next_node 始终指向 head

来源

链表工具

该仓库包含多个链表实用函数

环检测

has_loop 属性使用集合来跟踪已访问的节点,以检测链表是否包含循环。

来源

节点交换

swap_nodes 方法根据数据值交换链表中两个节点的位置。

来源

查找中间元素

middle_element 方法使用“慢快指针”技术,一次遍历即可找到链表的中间节点。

来源

反转链表

reverse 方法反转链表中节点的顺序。

来源

合并两个链表

merge_lists 函数将两个已排序的链表合并为一个新的已排序链表。

来源

二叉树

二叉树是一种层次数据结构,其中每个节点最多有两个子节点。

二叉搜索树

该仓库实现了二叉搜索树(BST),一种特殊的二叉树,其中:

  • 节点的左子树只包含键小于节点键的节点
  • 节点的右子树只包含键大于节点键的节点
  • 左右子树也都是二叉搜索树

关键操作

  • insert(*values): 将值插入二叉搜索树
  • search(value): 查找具有给定值的节点
  • get_max(): 获取最大值节点
  • get_min(): 获取最小值节点
  • remove(value): 删除具有给定值的节点
  • traversal_tree(): 遍历树(前序、中序或后序)
  • find_kth_smallest(k, node): 查找第 k 小的元素

遍历方法

  • preorder_traverse: 访问节点,然后左子树,然后右子树
  • inorder: 访问左子树,然后节点,然后右子树(对于二叉搜索树返回排序顺序)
  • postorder: 访问左子树,然后右子树,然后节点

来源

使用示例

创建和使用单向链表

来源

创建和使用二叉搜索树

来源

结论

TheAlgorithms/Python 仓库中的数据结构实现提供了常见数据结构的清晰、教育性示例。它们旨在兼具功能性和教学性,使其成为学习 Python 数据结构概念的优秀资源。

每个实现都附带了详尽的文档字符串(docstrings)和单元测试(doctests),既提供了文档也验证了预期行为。代码遵循一致的模式和地道的 Python 风格,使其对不同水平的学习者都易于理解。