带头双向循环链表(深度解剖)

篮球哥温馨提示:编程的同时不要忘记锻炼哦!

  键盘敲烂,工资过万!爱打篮球的程序猿教你“敲烂键盘” 😎

带你编程带你飞,带你飞进垃圾堆!✨


上期我们讲完了无头单向非循环链表,这期我们接着来讲链表中结构最复杂的带头双向循环链表!

本期主要内容:

🐱 什么是带头双向循环链表?

😻 带头双向循环链表常用接口实现!

🙀 顺序表和链表的区别和联系!


什么是带头?双向?循环?(带头双向循环链表)

带头:代表链表存在一个哨兵位节点,也就是头节点,这个节点不存放任何的有效数据!

双向:每个节点都有两个指针,分别指向它的前一个节点和后一个节点!

循环:最后一个节点next不再指向NULL指向的是哨兵位节点,哨兵位节点prev指向的是最后一个节点!(如果是单项链表的话哨兵位不指向最后一个节点!)

带头双向循环链表:结构最复杂,一般用在单独存储数据实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了,后面我们代码实现了就知道了!


 带头双向循环链表常用接口实现!

😪 搭建带头双向循环链表的结构!

 

 😃 带头双向循环链表的初始化创建新节点

 

 😊 头部插入节点!

 

 🥰 尾部插入节点!

 

 🤩 头部删除节点!

 

 😊 尾部删除节点!

 🤔 在pos节点前插入节点!

我们首先要找到pos节点的地址! 

ListNode* ListFind(ListNode* phead, LTDataType x)
{
	assert(phead);
	ListNode* cur = phead->next;
	while (cur != phead)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

 😁 删除指定pos节点!

 看了上面的那么多的图解,相信删除指定节点对你来说也很简单吧!我就直接上代码了!

void ListErase(ListNode* pos)
{
	assert(pos);
	ListNode* prev = pos->prev;
	ListNode* next = pos->next;
	prev->next = next;
	next->prev = prev;
	
	free(pos);
	pos = NULL;
}

🙂 最后别忘记销毁链表哦!

void ListDestory(ListNode* phead)
{
	ListNode* cur = phead->next;
	while (cur != phead)
	{
		ListNode* next = cur->next;
		free(cur);
		cur = next;
	}
	free(phead);
	phead = NULL;
}

其实很多小伙伴一看到数据结构就头疼,但是我想说,不要嫌画图麻烦,一定要多画图,这样更有利于我们实现代码,靠脑袋空想是想不出来的!

最后爱打篮球的程序猿想送小伙伴们一句话:天再高又怎样,踮起脚尖就更接近阳光!

下期预告:链表OJ题详解

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序猿教你打篮球

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

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

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

打赏作者

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

抵扣说明:

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

余额充值