题目描述
给你一个链表的头节点head
和一个整数 val
,请你删除链表中所有满足 Node.val==val
的节点,并返回新的头节点 。
这道题的思路是,设置prev和cur两个结构体指针,prev初始化为空,cur指向链表的第一个元素,接下来分两种情况讨论:1.如果cur->val == val,那么我们要把这个元素从链表中删除掉,并待删除的元素的前一个元素指向待删除的元素的后一个元素,以此删除元素;2.如果cur->val != val,那么只需让prev=cur,cur=cur->next,继续查找下一个元素即可。
需要特别注意的是,在cur->val=val这种情况下,如果prev==NULL,这说明prev一直没动,那么就不能完成上述1中的操作(因为1中的操作需要对prev解引用),此时需要让head=next;如果prev!=NULL,才可以完成上述1中的操作。
完成代码如下:
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode* prev=NULL;
struct ListNode* cur=head;
while(cur)
{
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;
}