最近在看coursera上的慕课,感觉还挺简洁的,推荐一下:
数据结构与算法
而且有配套的slides可以学习。
第二章 线性表
2.1 线性表
线性表的概念
表目:线性表中的元素(可包含多个数据项,记录)
空表:长度为零的线性表。
线性结构
二元组B=(K,R)K为元素,R为关系
逻辑关系:前驱/后继,其性质为:
- 反对称性:a1为a2的前驱,则a2不能为a1的前驱
- 传递性:前驱和后继的传递
线性表逻辑结构包括:长度 表头 表尾 当前位置
线性结构的性质为:
- 均匀性:即元素之间的数据类型和长度应该相同
- 有序性:相对位置为线性
线性表分类
-
按照逻辑结构分:
-
按照存储结构分:
顺序表:连续存储
链表:链式存储 -
按照线性表运算分:
线性表:不限制操作
栈(LIFO,后进先出):插入和删除都在同一端
队列(FIFO,先进先出):插入操作在一端,删除在另一端 -
按复杂程度划分:
- 简单的:线性表、栈、队列、散列表(索引+检索)
- 高级的:广义表、多维数组、文件
-
按访问方式划分
直接访问型、顺序访问型、目录索引型
2.2 顺序表
查找元素快速
插入、删除元素较慢
存储效率高
需要预先知道最大长度
需要连续存储空间
2.3 链表
分类:单链 双链 循环链
存储节点 = 数据域 + 指针域
- 单链表(singly linked list)
- 简单的单链表
第1个结点为head,指针域指向a0。
空表判断:head == NULL
当前结点:curr - 带头结点的单链表
第1个结点:head -> next, head ≠ NULL
空表判断:head -> next = NULL
当前节点a1 : fence -> next (fence为前驱)
- 简单的单链表
- 双链表(double linked list)
元素 = prev + data + next
- 循环链表(circularly linked list)
将单链表/双链表的头尾结点相连
没有增加额外开销 更方便
注意:单链表尾结点:an-1 -> next = NULL,但循环链表为:an-1 -> next = head
2.4 顺序表和链表的比较
顺序表 | 链表 | |
---|---|---|
存储数据特点 | 适合存储静态数据 | 适合存储动态数据 |
插入、删除操作 | 速度慢,时间复杂度O(n) | 速度快,时间复杂度O(1) |
查找操作 | 速度快,时间复杂度O(1) | 速度慢,时间复杂度O(n) |
存储结构 | 存储需要连续空间 | 存储使用动态空间 |
存储效率 | 存储效率高 | 每个元素都有结构性存储开销 |
长度估计 | 需要预先估计最大长度 | 无需事先了解线性表长度 |