☃️个人主页:fighting小泽
🌸作者简介:目前正在学习C语言和数据结构
🌼博客专栏:leetcode练习题
🏵️欢迎关注:评论👊🏻点赞👍🏻留言💪🏻
文章目录
- 一.链表必会题 - - 力扣203移除链表元素
- 1.普通方法
- 2.带哨兵位的链表
- 结尾
- 结尾
一.链表必会题 - - 力扣203移除链表元素
题目链接:移除链表元素
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
1.普通方法
首先我们能想到的就是遍历一遍链表,将不等于val的节点通过尾插的方式连接起来,将等于val的结点释放掉
测试代码:
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode* fast=head;
struct ListNode* slow=NULL;
while(fast)
{
if(fast->val == val)
{
slow->next=fast->next;
free(fast);
fast=slow->next;
}
else
{
slow=fast;
fast=fast->next;
}
}
return head;
}
但是仅仅这样是行不通的,当val在头节点的位置时,我们这样是无法释放头节点的。所以我们要判断头节点是不是等于val,若等于,我们就将头节点指向它的下一个结点,并释放掉当前节点。要是节点元素一直等于val,我们就将头节点一直向后挪,直到指向NULL。
正确代码如下:
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode* fast=head;
struct ListNode* slow=NULL;
while(fast)
{
if(fast->val == val)
{
if(slow)
{
slow->next=fast->next;
free(fast);
fast=slow->next;
}
else
{ 在这里判断头节点,释放并挪动头节点的位置
fast=fast->next;
free(head);
head=fast;
}
}
else
{
slow=fast;
fast=fast->next;
}
}
return head;
}
2.带哨兵位的链表
所谓带哨兵位的链表,就是一个附加的链表的节点,该节点作为第一个节点,它的值域并不存储任何东西,只是为了操作的方便引用的。
有了哨兵位作为链表的头节点,我们就不需要不断改变头节点的位置了,只需要将节点值不等于val的节点不断尾插到哨兵位后面就可以了,听着是不是非常简单呢。
代码如下:
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode* cur=head;
struct ListNode* rhead=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* p=rhead;
while(cur!=NULL)
{
if(cur->val != val)
{
p->next=cur;
p=p->next;
}
cur=cur->next;
}
p->next=NULL;
return rhead->next;
}
注意:哨兵位的下一个节点才是我们的头节点,并且要将最后一个节点的指针置空,它指向的可能是我们刚刚释放掉的空间
结尾
结尾
这些就是我给大家分享的关于移除链表元素的知识啦,希望我们都能有所收获
先赞后看,养成习惯!!^ _ ^
码字不易,大家的支持就是我坚持下去的动力,点赞后不要忘了关注我哦!
如有错误,还请您批评改正(。ì _ í。)