03线性表之链表
Posted 再吃一个橘子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了03线性表之链表相关的知识,希望对你有一定的参考价值。
肚子饿了就要吃 ~ 嗝 ——— 路飞
1.本章重点
- 链表表示和实现(单链表+双链表)
- 链表的常见OJ题
- 顺序表和链表的区别和联系
2.为什么需要链表
引子:顺序表的问题及思考
(1)动态顺序表
特点:
- 插入数据,空间不够了,需要增容。
- 要求数据是依次存储的。
缺陷:
- 如果空间不够,增容。增容会付出一定的性能消耗,需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
- 增容,可能存在增容后的空间有所浪费。( 增容一般都是增容2倍 )
- 头部或者中部左右插入数据,要求依次移动,插入效率低下。( O(N) )
(2)如何解决:
- 按需求给空间(存一个给一个)。
- 不需要物理空间连续,头部和中部的插入,不需要挪动数据。
这就引出了一个新的物理存储结构 ————> 链表
3.链表的概念及结构
概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
逻辑结构(想象出来的),如图:(单链表为例)
物理结构(在内存中的结构),如图:(单链表为例)
实际中要实现的链表的结构非常多样,以下情况组合起来就有8种链表结构:
- 单向,双向
- 带头,不带头
- 循环,非循环
虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构:
1. 无头单向非循环链表:
结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。
2. 带头双向循环链表:
结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了,后面我们代码实现了就知道了。
4.单链表的实现
注:
plist/phead——>头指针(一般保持不动)
cur——>当前位置( current简写)
找尾巴注意的点:
对比
//错误代码
//找到原来的尾巴(进而插尾)
SLTNode* tail = phead;
while (tail != NULL)
{
tail = tail->next;
}
//正确代码
//找到原来的尾巴(进而插尾)
SLTNode* tail = phead;
while (tail->next != NULL)
{
tail = tail->next;
}
解释:
第一段代码是错误的,因为
以上是关于03线性表之链表的主要内容,如果未能解决你的问题,请参考以下文章