题目描述
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
代码一
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode *h,*L,*p;
if(head==NULL||(head->val==val&&head->next==NULL))
return NULL;
h=head;
L=head->next;
while(L!=NULL)
{
if(L->val==val)
{
p=L;
L=L->next;
h->next=L;
free(p);
}
else
{
L=L->next;
h=h->next;
}
}
if(head->val==val)
head=head->next;
return head;
}
代码二(添加一个虚拟头结点)
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode *h,*H,*L,*p;
if(head==NULL)
return NULL;
h=(struct ListNode *)malloc(sizeof(struct ListNode));
h->val=-1;
h->next=head;
H=h;
L=h->next;
while(L!=NULL)
{
if(L->val==val)
{
p=L;
L=L->next;
H->next=p->next;
free(p);
}
else
{
L=L->next;
H=H->next;
}
}
return h->next;
}
单链表如果有头结点的话会方便对首元结点的处理,该链表无首元结点,因此构造一个新的结点让其指针域指向该链表作为该链表的头结点,从而方便当链表首元结点需要删除时对其的处理
代码三(使用递归,官方给的解答之一)
struct ListNode* removeElements(struct ListNode* head, int val){
if(head==NULL)
return head;
head->next = removeElements(head->next,val);
return head->val == val ? head->next : head;
}
这种方法运行时间快了,但是内存消耗比较大。
|