单链表的头删,尾删(2)

1.单链表的尾删

在讲这个问题前,推荐大家去看一些我上一篇博客。

1.1头指针后无任何节点

这个比较简单,因为没有数据可以去删去,所以我们直接return 就可以了。

if (*stlheap == NULL)return;

1.2头指针后只有一个节点

上图!

这种情况我们如何删去这个节点呢?

if ((*stlheap)->next == NULL)
{
	snode* temp1 = *stlheap;
	*stlheap = NULL;
	free(temp1);
	return;
}

首先,必须保留一个指针,这个指针是指向被删除的节点。

目的是为了 free 也就是释放掉这份空间。

可能你会说,我释放与否,并不影响我做oj题目的正确。

这只是因为,你的代码体量小,就算内存泄漏,也不会有啥影响。

(因为内存总量相对于你泄露的那点是很大的,因此无伤大雅)

但一旦量上去,比如深度递归,就可能会造成内存问题。

1.3头指针后有两个以上的节点

上图!

因为,我们要删除掉最后一个节点,所以我们就要先找到链表最后一个节点的位置,同时我们还要存一个指针的是指向这个节点的,因此我们需要找到倒数第2的节点的前一个节点的指针。

哈哈哈哈,是不是非常绕。给你来看看代码吧。

snode * temp = *stlheap;
while (temp->next->next!=NULL)
{
	temp = temp->next;
}
snode* temp1 = temp->next;
temp->next = NULL;
free(temp1);

这样一份代码就出锅了! 

总体思路就是找到,最后一个节点  然后存上位置,然后释放掉就欧克。

因为这里解释起来比较费时间,我就先偷个懒,如果有问题,评论或者私信都可。

2.单链表的头删

这里同样也是三种情况

这里我就不给大家细细的再去讨论了。

逻辑图如上

代码图如下

void slistpopfront(snode** stlheap)
{
	if (*stlheap == NULL)return;
	if ((*stlheap)->next == NULL)
	{
		snode* temp1 = *stlheap;
		*stlheap = NULL;
		free(temp1);
		return;
	}
	snode* temp = *stlheap;
	*stlheap = (*stlheap)->next;
	free(temp);
}

3.本章小结

本章内容讲了单链表的头删和尾删操作,分为了三种情况讨论,希望可以帮大家更细致的理解内容。谢谢大家的支持!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值