一、线性表
线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表,链表,栈,队列,字符串
线性表在逻辑上是线性结构,也就是说是连续的一条直线。但是在物理结构中并一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
二、顺序表
2.1 概念以及结构
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改。
顺序表一般可以分为:
静态顺序表:使用定长数组存储元素。
动态顺序表:使用动态开辟的数组存储。
中间、头部的插入删除,时间复杂度为O(N)
增容需要申请新的空间,拷贝数据,释放就空间,会有不小的开销
增容一般是呈现2倍的增长,势必会有一定的空间浪费。例如,当前容量为100,满了之后增容到200,我们再继续插入5个数组,后面没有数据插入了,那么就浪费了95个数据空间
三、链表
3.1 链表的概念以及结构
概念:链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
链式结构在逻辑上是连续的,但是在物理上不一定是连续的
现实中的节点一般是从堆上申请出来的
从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续
3.2 链表的分类
单向或者双向
带头或者不带头
循环或者非循环
虽然有这么多的链表的结构,但是我们实现中最常用的还是两种结构:
无头单向非循环链表:结构简单,一般不会单独用来存储数据。实际上更多是作为其他数据结构的子结构,比如:哈希桶,图的邻接表等等。
带头双向循环链表:结构最复杂,一般用在单独存储数据。实际上使用的链表数据结构,都是带头双向循环链表。
四、顺序表和链表的区别和联系
不同点 | 顺序表 | 链表 |
存储空间上 | 物理上一定连续 | 逻辑上连续,物理上不一定连续 |
随机访问 | 支持O(1) | 不支持,O(N) |
任意位置插入或者删除元素 | 可能需要搬移元素,效率低,O(N) | 只需修改指针的指向 |
插入 | 动态顺序表,空间不够时需要扩容 | 没有容量的概念 |
应用场景 | 元素高效存储 + 频繁访问 | 任意位置插入和删除频繁 |
缓冲利用率 | 高 | 低 |