方法1:递归调用
每次对头进行判断是否此值等于给定值val,如果相等则将此节点删除,将下一个节点作为头节点递归调用自己,否则将此节点的下一个节点为作为头节点递归调用自己,调用后的返回值作为此时头节点的下一个节点。
ListNode* clear(ListNode* head, int val)
{
if(head==NULL)
return NULL;
else if(head->val==val)
{
ListNode* newhead=clear(head->next,val);
free(head);
return newhead;
}
else
{
head->next=clear(head->next,val);
return head;
}
}
方法2 非递归调用:
单链表无法直接访问前驱节点,需要设置2个指针pre、p,使pre是p的前节点
1.首先要确认头结点绝对不是要删除的对象,一直找到这样一个节点为止
while(head!=NULL&&head->val==val)
head=head->next;
2.判断是否为空,注意为什么放在第二步
3.ListNode *pre = head;
ListNode *p = head->next;
while(p)
{
if(p->val==val)
{
pre->next=p->next;
p=p->next;
}
else
{
pre=p;
p=p->next;
}
}
return head;