删除链表中等于给定值 val 的所有节点。
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
删除中间节点和容易,拿一个节点q记录p-next,p=p->next,释放q;
麻烦的是如果第一个节点就是要删除的情况。
先放正确的
struct ListNode* removeElements(struct ListNode* head, int val){
if(head==NULL) return head;//考虑第一个节点为空的情况
struct ListNode *q=head;
struct ListNode *p=head;
while(p->next)
{
q=p->next;
if(q->val==val)
{
p->next=q->next;
free(q);
}
else p=p->next;
}
if(head->val==val)//最后再处理第一个节点是删除节点的情况
{
q=head->next;
free(q);
return head-next;
}
return head;
}
起初的想法是是一开始就考虑第一个节点是删除节点的情况去做判断,但这样如果链表只有一个节点,head已经为NULL了,那后面的p->next就错了。
if(head->val==val)
{
head=head->next;
free(q);
}
所以应该最后再考虑第一个节点。我先不管你第一个节点,先把后面的节点该删的删,最后就看你第一个节点。