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.本章小结
本章内容讲了单链表的头删和尾删操作,分为了三种情况讨论,希望可以帮大家更细致的理解内容。谢谢大家的支持!
582

被折叠的 条评论
为什么被折叠?



