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

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

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

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

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

//静态链表的节点
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; //指向直接后继
};

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民真快落

我琢磨着也没人给我打赏呀。。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值