一、顺序表 VS 链表
1.顺序表
优点
- 支持随机访问(用下标访问);有些算法需要结构支持随机访问。如二分查找、优化后的快排等等。
- CPU高速缓存命中率更高。
缺点
- 头部中部插入删除效率低【O(N)】
- 顺序表要求数据从开始位置连续存储。那么我们在头部或者中间位置插入或删除数据时,就需要挪动数据,效率低【O(N)】。
- 扩容消耗资源
- 空间不够了需要增容,增容是要付出代价的。尤其是realloc异地扩容(还需要拷贝原数据【O(N)】)
- 为了避免频繁扩容,空间满了我们基本都是扩大2倍,可能就会导致一定的空间浪费。
2.链表
优点
- 任意位置插入删除效率高【O(1)】
- 由于存储空间是不连续的,也就不存在顺序表扩容拷贝和插入数据需要挪动所有元素的问题
- 更合理的使用内存空间
- 按需申请内存空间,不用了就释放空间
缺点
- 不支持随机访问(用下标访问);这就意味着一些排序、二分查找等在这种结构上不适用。
- 链表存储一个值,同时还要存储链接指针,有一定的消耗。
- CPU高速缓存命中率更低
二、8种链表结构
单向、双向
带头、不带头
单链表、循环链表
三、最常用的两种链表结构
无头单向非循环链表
无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结
构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。
带头双向循环链表
带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都
是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带
来很多优势,实现反而简单了。