前言
路漫漫及修远兮。
一、题链接
二、题意
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
例题一:
输入:head=[1,2,3,4,5,6]; val=6;
输出:[1,2,3,4,5];
例题二:
输入:head=[]; val=1;
输出:[];
例题三:
输入:head={7,7,7,7,7}; val=7;
输出:[];
三、思路1
一、想要移除等于val的节点,就必须知道等于val处节点的位置,故这里需要一个指针来指向这个等于val的节点,这个指针的名字定义为cur。
structu ListNode*cur;
二、即使有一个指针指向了待移除的节点位置,移除之后要怎么连接前后节点,故这里还有一个指针指向指针cur前一个节点,这个指针的名字定义为curBack。
structu ListNode*curBack=NULL;
三、为了方便,我们在定义一个指针next来指向cur前一个节点,这样方便写代码,也不容易出错。
structu ListNode*next=cur->next;
四、所以这个题我们定义三个指针来完成。
注意:如果全部的节点都是val的情况和第一个节点就是NULL的情况,如果第一个是val,这头节点就要改变了。
思路1图解
思路1的代码
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode*cur=head;
struct ListNode*curBack=NULL;
while(cur!=NULL)
{
if(cur->val==val)
{
struct ListNode*next=cur->next;
if(curBack==NULL)
{
free(cur);
head=next;
cur=next;
}
else
{
curBack->next=next;
free(cur);
cur=next;
}
}
else
{
curBack=cur;
cur=cur->next;
}
}
return head;
}
四、思路2
在思路1是中,我们用了curBack指针,但是当第一个节点就是cur时,我们就要判断一下,要不了就会有这样的情况。
一开始curBack是一个指向NULL的指针,但当第一个节点就是val时,如果不加if(curBack==NULL)的话,就会出现curBack->next=next;错误,因为curBack是空指针,所以会报错。
所以我们就有是思路2:
就是我们建一个哨兵位。
思路2图解
哨兵位就是->guarHead
思路2代码
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode*cur=head;
struct ListNode*guardHead=(struct ListNode*)malloc(sizeof(struct ListNode));
guardHead->next=head;
head=guardHead;
while(cur!=NULL)
{
struct ListNode*next=cur->next;
if(cur->val==val)
{
guardHead->next=next;
free(cur);
cur=next;
}
else
{
guardHead=cur;
cur=next;
}
}
return head->next;
}
总结
少年啊!