目录
1 绪论
1.1.1 数据结构的基本概念
1.2.1 算法的基本概念
1.2.2 时间复杂度
1.2.3 空间复杂度
2 线性表
2.1 线性表的定义和基本操作
2.2 顺序表
2.2.1 顺序表的定义
- 注意区分顺序表与数组的下标
- 动态分配和静态分配都是分配连续空间
2.2.2 顺序表上基本操作的实现
-
插入
- 一般使用 前插法
- 将插入位置之后的元素向后平移一位
- 时间复杂度 O(n)
-
删除
- 将删除位置之后的元素依次往前平移一位
- 时间复杂度 O(n)
-
查找
2.3 链表
2.3.1 单链表的定义
- 每个元素:data 和 指针域
-
引入头节点,有两个优点:
- 第一个位置和其他位置操作的天涯
- 空表和非空表操作的统一(例如判断是否为空表)
2.3.2 单链表上基本操作的实现
- 建立
-
头插法 O(n)
-
尾插法
-
头插法 O(n)
- 查找
- 按序号查找 & 按值查找
- 插入
- 前插法 O(n)
- 先查找
- 再修改(修改的顺序不能反)
- 后插法 O(1)
- 直接在给定位置插入元素即可(不需要查找)
- 可以使用 后插法 实现 前插法
- 先使用后插法插入元素,然后交换两元素位置
- 前插法 O(n)
- 删除
- 给定下标
- 给定节点地址
- 普通:先查找,再删除 O(n)
- 加速:先交换,后删除 O(1)
- 给定下标
- 求表长
- 加入头节点的另一个好处:空表和非空表操作的统一(例如判断是否为空表)
2.3.3 双链表
- 定义
- 特点:引入了前驱指针(prior *)
- 注意:双链表没有尾节点,因此操作不是统一的
- 插入 O(1)
- 删除 O(1)
2.3.4 循环链表
循环单链表
循环双链表
2.3.5 静态链表
- 定义:
- 用数组实现链表结构
- next存的是下一个节点的下标
- -1表示是最后一个节点
- 静态链表不能动态扩展
- 适用于没有指针的语言
2.3.6 顺序表与链表的比较
- 存取方式:
- 逻辑结构和物理结构
- 基本操作 -- 时间复杂度
- 内存空间
- 怎么选择
- 三个常用操作,分别选择什么数据结构
- 最值 - 遍历 【时间 O(n)】
- 逆序 - 对换位置
| 顺序表【时间O(n)空间O(1)】 | 链表【时间O(n) 空间 O(1)】 |
- 归并
| 顺序表【时间O(n+m) 空间O(n+m)】 | 链表【时间O(n) 空间 O(1) 或 O(0)(不创建新链表)】 |