关于顺序存储结构的内容,就止步于双端队列了。接下来要介绍的是链表的内容,相对用于实现顺序表的数组来说,链表的定义即实现就比较抽象和麻烦一些,而且还难!but!虽然难,“我”也不会气馁!该说还得说啊,虽然自己是个菜鸟,但是总有一天,......算了,先介绍一下链表是啥吧。
先来看一条生活中常见的链子:
我们发现,生活中不管金链子也好、还是银链子也好、亦或者是铁的都是由一个小小的环连在一起,然后组成了一条链子。也就是说:
所以运用生活中的原理,我们就创建出了链表这一概念。
动态链表
为了表示每个数据元素ai与其直接后继数据元素ai+1 之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称做指针或链。这两部分信息组成数据元素ai的存储映像,称为结点(Node)。【这是官方定义!】
结点
简单点来说吧!这个结点就可以看成上面图片中的一个环,然后然后环环相连,组成一条的链子就是链表,与实际的链子不同的是,实际的链子中的环是空的,但是它套着下一个环,而在数据结构中,这个结点赋予了特殊含义,首先它是一个类,然后这个类里面有两个属性:一个是数据域,存储我们需要存储的数据;另一个是指针域,存储的是下一个结点所在的地址,方便我们找到该结点的位置。就是因为有这个指针域将下一个结点的地址存储,才形成了逻辑上的链式存储。结点以及链表大概长这个样子:
因此,n个结点(ai 的存储映像)链结成一个链表,即为线性表(a1, a2, ....,an)的链式存储结构,因为此链表的每个结点中只包含一个指针域, 所以叫做单链表。
头指针和尾指针
那么问题来了。我们知道每个结点的指针域存储的是下一个结点所在的位置,这个位置是内存随机分配的,我们并不知道。因此,第一个结点的位置我们是不知道的,那么这个链表该从哪儿开始查找呢?为了解决这个问题,需要设置一个头指针。
我们把链表当中的第一个结点叫做头结点,在链式存储的结构当中,头结点可虚可实,什么意思呢?就是分为真实的头结点——它存储元素,也存储下一个结点的地址,是真真正正的老大!虚拟的头结