链表的五种形式

1.单链表

在这里插入图片描述

在每个结点中除了包含数据域外,还包含一个指针域,用以指向其后继结点。图2-2所示为带头结点的单链表。这里要区分一下带头结点的单链表和不带头结点的单链表

①带头结点的单链表中头指针head指向头结点,头结点的值域不含任何信息,从头结点的后继结点开始存储信息。对于带头结点的单链表,它的头指针head始终不等于NULL,head->next等于NULL的时候链表为空。

②不带头结点的单链表中的头指针head直接指向开始结点,即图2-2中的结点A1,当head等于NULL的时候链表为空。

总之,两者最明显的区别是,带头结点的单链表有一个结点不存储信息,只是作为标志,而不带头NULL的时候链表为空。
注意:在题目中要区分头指针和头结点,不论是带头结点的链表还是不带头结点的链表,head指针即头指针都指向链表中的第一个结点。而头结点是”带头结点的链表”中的第一个结点,只作为链表存在的标志,结点内不存储信息。

2.双向链表

在这里插入图片描述

单链表只能由开始结点走到终端结点,而不能由终端结点反向走到开始结点。如果要求输出从终端结点到开始结点的数据序列,则对于单链表来说操作就非常麻烦。为了解决这类问题,构造了双链表。图2-3所示为带头结点的双链表。双链表就是在单链表结点上增添了一个指针域,指向当前结点的前驱。这样就可以方便地由其后继来找到其前驱,从而实现输出终端结点到开始结点的数据序列。

同样,双链表也分为带头结点的双链表和不带头结点的双链表,情况类似于单链表。

带头结点的双链表当head->next为NULL时链表为空,

不带头结点的双链表当head为NULL时链表为空。

3.循环单链表

在这里插入图片描述

知道了单链表的结构之后,循环单链表就显得比较简单了,只要将单链表的最后一个指针域(空指针)指向链表中第一个结点即可(这里之所以说第一个结点而不说是头结点是因为,如果循环单链表是带头结点的,则最后一个结点的指针域要指向头结点;如果循环单链表不带头结点,则最后一个指针域要指向开始结点)。图2-4所示为带头结点的循环单链表。循环单链表可以实现从任一个结点出发访问链表中的任何结点,而单链表从任一结点出发后只能访问这个结点本身及其后的所有结点。

带头结点的循环单链表当head等于head->next时链表为空,不带头结点的循环单链表当head等于NULL时链表为空。

4.循环双链表

在这里插入图片描述

和循环单链表类似,循环双链表的构造源自双链表,即将终端节点的next指针指向链表中第一个结点,将链表中第一个结点的prior指针指向终端结点,如图2-5所示。循环双链表同样有带头结点和不带头结点之分。带头结点的循环双链表head->next和 head->prior两个指针都等于head时链表为空,不带头结点的循环双链表当head等于NULL时链表为空

在这里插入图片描述

5.静态链表

在这里插入图片描述

静态链表借助一维数组来表示,如图2-7所示。图2-7中的左图是静态链表,右图是其对应的一般链表。一般链表结点空间来自于整个内存,静态链表则来自于一个结构体数组(或者向量vector)。数组中每一个结点(结构体结点,而非链表节点)含有两个分量:一个是数据元素分量data;另一个是指针分量(注意这里的指针不是地址,而是一个类似于数组下标的索引,是一个数字),指示了当前结点的直接后继结点在数组中的位置(这和一般链表中next指针的地位是同等的)

发布了167 篇原创文章 · 获赞 52 · 访问量 6947

猜你喜欢

转载自blog.csdn.net/qq_42363032/article/details/103761412