一、基本概述
1、概念:零个或多个数据元素的有限序列
2、特点:类型相同、有限性、有序性、
3、在较复杂的线性表中,一个数据元素可以由若干个数据项组成。
二、线性表的抽象数据类型
- 对于一个线性表,插入数据和删除数据都是必须的操作
- 线性表的抽象数据类型定义如下:
- 对于复杂的个性化的操作,其实就是把基本操作组合起来实现的。
三、线性表的顺序存储结构
1、读取存取数据时,不管是哪个位置,时间复杂度都是O(1);
2、插入删除操作时,时间复杂度都是O(n);
四、线性表的链式存储结构
n个结点链结成一个链表,即为线性表的链式存储结构,因为此链表的每个结点中只包含一个指针域(指向后继结点),所以叫单链表。
1、单链表的读取
- 时间复杂度:O(n)。从头开始查找,直到第i个节点。
- 核心思想:工作指针后移→算法的常用技术
2、单链表的插入
3、单链表的删除
4、插入和删除的对比
5、单链表的整表创建
创建单链表的过程是一个动态生成链表的过程。即从空表的初始状态起,依次建立各元素结点,并逐个插入链表。插队的思想。
- 头插法:始终让新结点在第一的位置。
- 尾插法:把每次新结点都插在终端结点的后面。
6、单链表的整表删除
在内存中将链表内容给释放掉。不能直接将结点置为空,因为结点有数据域和指针域,需要根据指针将每个结点的数据域置为空。
总结:顺序存储结构和单链表结构的对比
经验型结论:
- 若需要频繁查找,很少进行插入和删除操作,推荐顺序存储结构;若需要频繁的插入和删除时,推荐单链表结构。
- 若事先知道线性表的元素个数,推荐顺序存储结构。若事先不知道元素个数,推荐单链表结构。
五、其他链表
1、静态链表:用数组描述的链表,也叫游标实现法。
第一个元素的cur放第一个空闲结点的下标,最后一个元素放第一个有数值的结点的下标,这样就可以完全确定该数组了。
在实现插入操作时,先在有数值结点的尾巴上插入一个元素并将cur置为理论上的下一个元素的下标,然后将第一个元素的cur值+1,再修改要插入位置的结点前的cur值进行改变即可。
- 插入操作:静态模拟动态链表结构的存储空间的分配
从备用链表取第一个结点作为待插入的新结点。
- 删除操作:
- 静态链表的优缺点:
2、循环链表
这里不用头指针,用指向终端结点的尾指针来表示循环链表,此时查找开始结点和终端结点就很方便了。
将两个循环链表合并成一个表时:
3、双向链表
双向循环链表:
增加和删除元素的注意事项自己想明白了就行。
总结:
线性表总结