Every day a leetcode
题目来源:203. 移除链表元素
解法1:哨兵节点
哨兵结点的使用有利于链表代码的标准化,可以减少一些额外的分支判断。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val){
if(head == NULL) return head;
struct ListNode* l=malloc(sizeof(struct ListNode));
l->next=head;
struct ListNode* p=l;
while(p->next)
{
if(p->next->val!=val) p=p->next;
else
{
struct ListNode* next=p->next->next;
free(p->next);
p->next=next;
}
}
return l->next;
}
结果:
解法2:不使用哨兵节点
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val){
//找到第一个值不为val的结点
while(head && head->val == val) head=head->next;
if(head == NULL) return NULL;
struct ListNode* p=head;
while(p->next)
{
if(p->next->val!=val) p=p->next;
else
{
struct ListNode* next=p->next->next;
free(p->next);
p->next=next;
}
}
return head;
}
结果:
解法3:递归
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val){
if(head == NULL) return head;
head->next=removeElements(head->next,val);
if(head->val!=val) return head;
else return head->next;
}
结果: