双向带头结点链表全面详解(附带源码)

本文详细介绍了双向带头链表的结构、特点,包括头插、尾插、随机插入、销毁链表、判空、打印、查找元素及头尾删除操作,并提供了相应的源码示例。这种链表结构弥补了单链表的不足,适用于需要前后双向访问的应用场景。
摘要由CSDN通过智能技术生成

目录

为什么有双向带头结点链表?:

1、头插:

2、尾插:

3、随机插入:

4、销毁链表

5、判空:

6、打印

8、找元素

9、头删:

10、尾删:

源码:



 

为什么有双向带头结点链表?:

由于单链表的操作有缺陷:
1、不能找到前驱
尾插和尾删以及中间插入删除都,找到前驱,而且不能从后往前,只能从前往后
而双向链表可以解决单链表的缺陷
双向链表有两个指针,一个指向前驱,一个指向后继:

链表可以有多种结构:
单链表、双链表
带头结点链表
循环链表 非循环链表
其他结构都是以上六种结构的组合,可以根据数据的实际情况来决定其组织形态,可以很灵活。

例如:
带头节点链表
头节点不存储数据
尾插时,直接加,不需要像链表需要进行判空处理
而对于众多的组合链表当中,最实用,结构设计最完美的是双向带头结点循环链表:

1、头插:


记录phead下一个节点first,插入的节点放到头节点和first节点中间
phead-next = newNode;
newNode -> prev = phead->next;//这两句是描述插入到头节点之后
下面就是将节点放在first之前:
newNode ->next = first;
first->prev = nweNode;

(由于这个结构特殊,不需要对空表进行判断,看图一目了然)


2、尾插:


因为最后一个节点指向头节点,头节点的前驱指向最后一个节点,所以插入时,直接将头节点前驱指向新节点
,新节点指向头节点,然后新节点前驱指向前一个节点(原来的最后一个节点),原来的最后一个节点指向新节点,连接完毕
一定要习惯画图,学会画图!

3、随机插入:

insert(List,Find(List,x))
插入很简单,就是在该位置前面插入
找到其前面prev的节点,接入;再找到后面pos的节点即pos节点,然后进行连接操作,

4、销毁链表

重复头删或者尾删即可,直到链表为空

5、判空:

6、打印


定义一个指针,从头节点开始往后遍历,到达头节点结束

8、找元素

9、头删:


记录头节点后面两个节点,一个first,一个second。phead和second连接,free first,first置空
当链表只剩下头节点时,会出错,需要进行头节点判空,用断言

10、尾删:


同样是记录最后一个节点prev和前一个节点tail = phead->prev.
然后开始交换:
前一个头节点的前驱指向prev,prev->next指向头节点
然后free最后一个节点。即tail,再tail置空

源码:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

二十5画生

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值