从零开始的链表之旅【中】(图解链表)

本文旨在摆脱复杂的链表实现代码,从图解的角度一眼看穿链表的结构,同时做一些讲解,让你不再被一些高大上的链表名词吓到,对各种链表结构有个大概的认知。
(阅读本文前请先阅读从零开始的链表之旅【上】(基本知识点)

单链表在这里插入图片描述
这个图是一个普通的单链表,所谓的头结点其实没有什么实在意义,只是在定义头指针时一般直接创建一个头结点,让指针有个指向,也可以去掉它,让头指针直接指向首元节点。
首元节点是第一个数据域有值的节点,因此叫首元节点,没别的特殊含义。

循环链表
在这里插入图片描述
循环链表与单链表的区别只有:将最后一个节点指向第一个节点

静态链表:
静态链表和动态链表的区别是,静态链表实际上就是结构体数组来实现的,需要一开始就确定节点的大小,动态链表的节点则可以不断动态分配出来。

//静态链表的节点
struct node
{
     int data;//数据
     int cur;//下一个节点的数组下标
}

静态链表由备用链表和数据链表构成,备用链表的节点数据域没用,下标则用来表明还有哪些节点可以存储数据,一般a[0]为备用链表的表头,我们看还有哪些节点可以使用只需要看a[0].cur。

下面三个图展现了在静态链表中存储数字1 2的过程,一开始所有节点都可以用,所有节点的cur均为下一个节点的下标,当要存储1时,a[0].cur为1,表明a[1]可以用来存储数据,那么把数据1放入a[1].data,此时a[1]要被使用了,因此将a[0]的cur更新为2,表明a[2]可以存储数据,此时a[1]的cur为0表示它为数据链表的最后一个节点。

当要存储2时,a[0].cur为2,表明a[2]可以用来存储数据,那么把数据2放入a[2].data,此时a[2]要被使用了,因此将a[0].cur更新为3,此时数据链表中最后一个节点为a[2],因此a[2].cur=0

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

双向链表:
在这里插入图片描述
双向链表指的是节点间只能从前往后找,还可以从后往前找,这是因为每个数据配备了两个指针,一个指向前驱,一个指向后继。

//双向链表的节点结构
struct line{
    struct line * prior; //指向直接前趋
    int data;
    struct line * next; //指向直接后继
};

双向循环链表:
在这里插入图片描述

双向循环链表与双向链表的区别:将首位双向连接。

发布了61 篇原创文章 · 获赞 1 · 访问量 1369

猜你喜欢

转载自blog.csdn.net/qq_42622433/article/details/104157123