题目描述:
给你一个链表的头节点 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
输出:[]
提示:
列表中的节点数目在范围 [0, 104] 内
1 <= Node.val <= 50
0 <= val <= 50
分析:
移除链表中和val值相同的元素
定义两个指针,当前指针cur
,和当前指针之前的指针pre
当前指针cur
指向头节点,当前指针的前驱pre指向NULL
遍历链表:
- 当链表中当前元素
ur->val!=val
时,可以继续往下遍历,pre=cur
,cur=cur->next
- 当链表中当前元素
ur->val=val
时,就需要删除当前指针所指的节点,即通过pre来完成,让pre的指针域指向当前节点cur的下一个节点,pre->next=cur->next
。如果当pre为空时,就类似于头删。
代码:
c
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode*cur=head;
struct ListNode*pre=NULL;
while(cur)
{
if(cur->val!=val)
{
pre=cur;
cur=cur->next;
}
else
{
if(pre==NULL)
{
head=cur->next;
free(cur);
cur=head;
}
else
{
pre->next=cur->next;
cur=cur->next;
}
}
}
return head;
}