1.题目描述
题目链接:203. 移除链表元素 - 力扣(LeetCode)
2.解题思路
我们定义一个cur指向当前结点,定义prev指向前一个结点,next指向下一个结点
如果cur->val==val,那我们就删除这个结点
怎么删除呢:
我们让prev->next指向cur->next,然后free(cur)
为了防止野指针,我们可以定义一个next指向cur->next,先free(cur),再让prev->next指向next
特殊情况
如果cur为第一个结点,那prev就是空,我们在这里得分成两种情况:
如果prev不为空,则prev->next=next;
如果prev为空,head=next;
由于链表是无序的,因此我们需要遍历一遍才能删除所有的val,可以使用while循环来控制
3.代码
根据解题思路,我们可以写代码了:
struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode* prev=NULL;
struct ListNode* cur=head;
while(cur!=NULL)
{
if(cur->val==val)
{
struct ListNode* next=cur->next;
free(cur);
if(prev)
{
prev->next=next;
}
else
{
head=next;
}
cur=next;
}
else
{
prev=cur;
cur=cur->next;
}
}
return head;
}
结果就是通过了: