数据结构3(单向循环链表/双向链表的原理与应用)

单项循环链表的应用与原理

思考:对于单向链表而言,想要遍历链表,则必须从链表的首结点开始进行遍历,请问有没有更简单的方案实现链表中的数据的增删改查?

回答:是有的,可以使用单向循环的链表进行设计,单向循环的链表的使用规则和普通的单向链表没有较大的区别,需要注意:单向循环链表的尾结点的指针域中必须指向链表的首结点的地址,由于带头结点的单向循环链表更加容易进行管理,所以以带头结点的为例:
在这里插入图片描述
上图所示的就是一个典型的单向循环链表的结构,可以发现单向循环链表的结构属于环形结构,链表中的最后一个结点的指针域中存储的是链表的第一个结点的地址。

为了管理单向循环链表,需要构造头结点的数据类型以及构造有效结点的数据类型,如下:

在这里插入图片描述
(1) 创建一个空链表,由于是使用头结点,所以就需要申请头结点的堆内存并初始化即可!
在这里插入图片描述
(2) 创建新结点,为新结点申请堆内存并对新结点的数据域和指针域进行初始化,操作如下:
在这里插入图片描述
(3) 根据情况把新结点插入到链表中,此时可以分为尾部插入、头部插入、指定位置插入:

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

在这里插入图片描述
中插

在这里插入图片描述
(4) 根据情况可以从链表中删除某结点,此时可以分为尾部删除、头部删除、指定元素删除:

头删在这里插入图片描述
尾删

在这里插入图片描述
中删

在这里插入图片描述

双向链表的原理与应用

如果想要提高单向链表或者单向循环链表的访问速度,则可以在链表中的结点中再添加一个指针域,让新添加的指针域指向当前结点的直接前驱的地址,也就意味着一个结点中有两个指针域(prev + next),也被称为双向链表(Double Linked List)。
在这里插入图片描述
由于带头结点更加方便用户进行数据访问,所以本次创建一条带头结点的双向不循环的链表。
在这里插入图片描述
(1) 创建一个空链表,由于是使用头结点,所以就需要申请头结点的堆内存并初始化即可!
在这里插入图片描述
(2) 创建新结点,为新结点申请堆内存并对新结点的数据域和指针域进行初始化,操作如下:
在这里插入图片描述
(3) 根据情况可以从链表中插入新结点,此时可以分为尾部插入、头部插入、指定位置插入:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(4) 根据情况可以从链表中删除某结点,此时可以分为尾部删除、头部删除、指定结点删除:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
双向循环链表与双向链表的区别:指的是双向循环链表的首结点中的prev指针成员指向链表的尾结点,并且双向循环链表的尾结点里的next指针成员指向链表的首结点,所以双向循环链表也属于环形结构。

在这里插入图片描述
由于带头结点更加方便用户进行数据访问,所以本次创建一条带头结点的双向循环的链表。

(1) 创建一个空链表,由于是使用头结点,所以就需要申请头结点的堆内存并初始化即可!

(2) 创建新结点,为新结点申请堆内存并对新结点的数据域和指针域进行初始化,操作如下:

(3) 根据情况可以从链表中插入新结点,此时可以分为尾部插入、头部插入、指定位置插入:

(4) 根据情况可以从链表中删除某结点,此时可以分为尾部删除、头部删除、指定结点删除:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值