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; }
结果就是通过了: