数据结构第二章线性表
🤖 Assistant
1 | # 📦 第二章 线性表 |
🔸 核心原理:用连续存储单元存放线性表元素
🔸 特性:
- 支持随机访问(时间复杂度 O(1))
- 插入/删除平均移动 n/2 个元素(时间复杂度 O(n))
📌 静态分配 vs 动态分配
类型 | 特点 | 适用场景 |
---|---|---|
静态分配 | 数组大小固定 | 数据量已知且稳定 |
动态分配 | 可扩容(realloc) | 数据量变化较大 |
📚 链式存储结构(链表)
📌 单链表结构
1 | typedef struct LNode { |
🔹 核心要点:
- 节点 = 数据域 + 指针域
- 头指针 vs 头结点:
- 头结点:为统一操作而添加的虚拟节点(
data域无意义
) - 带头结点的链表操作更统一
- 头结点:为统一操作而添加的虚拟节点(
📌 循环链表
🔹 尾结点指针指向头结点
🔹 判空条件:尾结点->next == head
📌 双向链表
1 | typedef struct DuLNode { |
🔹 特性:支持双向遍历
🔹 插入/删除需同时修改前后指针
📊 顺序表 vs 链表对比
操作\结构 | 顺序表 | 链表 |
---|---|---|
存取元素 | O(1) | O(n) |
插入/删除 | O(n)(需移动元素) | O(1)(仅修改指针) |
空间分配 | 预先静态分配 | 动态实时分配 |
适用场景 | 查询多,增删少 | 频繁增删 |
🛠️ 应用场景
- 顺序表:高频随机访问(如数据库索引)
- 单链表:浏览器历史记录(支持后退)
- 双向链表:LRU缓存淘汰算法
- 循环链表:约瑟夫问题(Josephus problem)
🎨 思维导图总结
1 | graph TD |
```
评论