算法竞赛阶段二-数据结构(38)数据结构动态链表list
动态链表(List)的基本概念
动态链表是一种线性数据结构,通过节点间的指针连接实现动态内存分配。与数组不同,链表的大小可随需增减,插入和删除操作的时间复杂度为 O(1)(已知位置时),但随机访问需要 O(n) 时间。
常见动态链表类型
-
单向链表
每个节点包含数据和指向下一个节点的指针。class Node: def __init__(self, data): self.data = data self.next = None
-
双向链表
节点包含指向前驱和后继的指针,支持双向遍历。class Node: def __init__(self, data): self.data = data self.prev = None self.next = None
-
循环链表
尾节点指向头节点,形成闭环。
动态链表的操作
插入节点
在头部插入:
new_node = Node(data)new_node.next = headhead = new_node
在中间插入(已知前驱节点 prev_node
):
new_node.next = prev_node.nextprev_node.next = new_node
删除节点
删除头节点:
head = head.next
删除中间节点(已知前驱节点 prev_node
):
prev_node.next = prev_node.next.next
动态链表的优缺点
优点
- 内存按需分配,避免静态数组的浪费。
- 插入/删除高效,无需移动其他元素。
缺点
- 随机访问效率低。
- 需要额外空间存储指针。
动态链表的应用场景
- 实现栈、队列等抽象数据类型。
- 内存管理中的动态分配(如操作系统的空闲内存块管理)。
- 需要频繁插入/删除的场景(如实时系统)。
示例:单向链表的完整实现
class LinkedList: def __init__(self): self.head = None def append(self, data): new_node = Node(data) if not self.head: self.head = new_node return last = self.head while last.next: last = last.next last.next = new_node def print_list(self): current = self.head while current: print(current.data, end=\" -> \") current = current.next print(\"None\")
注意事项
- 动态链表需手动管理内存(如 C/C++ 中需释放节点)。
- 在 Python/Java 等语言中,垃圾回收机制自动处理内存释放。