描述
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足
Node.val == val 的节点,并返回新的头节点 。
示例
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:
输入:head = [ ], val = 1
输出:[ ]
示例 3:
输入:head = [7,7,7,7], val = 7
输出:[ ]
解题思路以及代码
解法1
创建一个新链表,把值不等于val的结点拿过来尾插
//后插
void SListPushBack(struct ListNode** pphead,struct ListNode* node)
{
if(*pphead == NULL)
{
*pphead=node;
}
else
{
struct ListNode*cur=*pphead;
while(cur->next != NULL)
{
cur=cur->next;
}
cur->next=node;
}
}
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode *plist=NULL;
struct ListNode *cur=head,*next=NULL;
while(cur)
{
next=cur->next;
if(cur->val != val)
{
cur->next=NULL;
SListPushBack(&plist,cur);
}
cur=next;
}
head=plist;
return head;
}
解法2
暴力求解
struct ListNode* removeElements(struct ListNode* head, int val){
//链表为空
if(head == NULL)
{
return head;
}
//排除第一个就是val
while(head != NULL && head->val == val)
{
head=head->next;
}
struct ListNode* cur=head,*prev=NULL;
while(cur)
{
if(cur->val != val)
{
prev=cur;
}
else
{
prev->next=cur->next;
}
cur=cur->next;
}
return head;
}
解法3
申请一个头结点,然后把不等于val等结点拿下来尾插。
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode* guard=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* tail=guard;
struct ListNode*cur=head;
while(cur)
{
if(cur->val != val)
{
tail->next=cur;
tail=tail->next;
cur=cur->next;
}
else
{
struct ListNode*del=cur;
cur=cur->next;
free(del);
}
}
tail->next=NULL;
head=guard->next;
free(guard);
return head;
}