链表数据结构详解
链表是一种线性数据结构,它通过节点之间的指针链接来存储数据,与数组的连续内存空间不同。每个节点包含两部分:
- 数据域:存储实际数据
- 指针域:存储指向下一个节点的地址
链表结构示意图
[数据|指针] → [数据|指针] → [数据|指针] → None
头节点(head) 尾节点
核心特点:
- 动态内存分配:节点在内存中非连续存储
- 高效插入/删除:O(1)时间复杂度(已知位置时)
- 低效随机访问:O(n)时间复杂度(需从头遍历)
- 无预分配空间:大小可动态增长
Python链表实现及遍历
class ListNode:
"""链表节点类"""
def __init__(self, data):
self.data = data # 数据域
self.next = None # 指针域(指向下一个节点)
class LinkedList:
"""链表类"""
def __init__(self):
self.head = None # 链表头节点
def append(self, data):
"""在链表末尾添加节点"""
new_node = ListNode(data)
if not self.head: # 空链表
self.head = new_node
return
current = self.head
while current.next: # 遍历到最后一个节点
current = current.next
current.next = new_node # 添加新节点
def print_list(self):
"""遍历打印链表"""
current = self.head
while current:
print(current.data, end=" → ")
current = current.next
print("None") # 表示链表结束
# 创建链表并测试
if __name__ == "__main__":
# 构建链表:1 → 3 → 5 → 7
ll = LinkedList()
ll.append(1)
ll.append(3)
ll.append(5)
ll.append(7)
# 遍历打印
print("链表内容:")
ll.print_list() # 输出:1 → 3 → 5 → 7 → None
遍历过程详解:
- 从
head节点开始(当前节点 = 头节点) - 循环执行:
- 打印当前节点数据
- 当前节点移动到
next指向的节点
- 当遇到
None时终止循环
链表类型对比
| 类型 | 指针特点 | 优势 |
|---|---|---|
| 单链表 | 每个节点只有next指针 | 内存效率高 |
| 双向链表 | 有prev和next两个指针 | 可双向遍历 |
| 循环链表 | 尾节点指向头节点 | 可循环访问 |
实际应用中:
- 浏览器历史记录(双向链表)
- 音乐播放列表(循环链表)
- 内存管理(单链表)
理解链表的关键是掌握指针操作和节点关系,这种结构为动态数据管理提供了高效解决方案。