力扣:203. 移除链表元素
题目:
203. 移除链表元素
难度简单1198
给你一个链表的头节点 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
两种做法:
第一种对法:(先处理头指针)
注意:
判断循环是否会操作空指针,设置好循环条件避免操作空指针
先处理头指针,处理好之后记得跳出循环
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val){
typedef struct ListNode* ListNode;
while(head!=NULL){
if(head->val==val){
head = head->next;
}else{
break;
}
}
ListNode p;
p = head;
while(p!=NULL&&p->next!=NULL){
if(p->next->val==val){
p->next = p->next->next;
}else{
p = p->next;
}
}
return head;
}
第二种对法:(虚拟头节点)
注意:
创建一个虚拟头节点,创建之后还要为他分配空间(不然他就只是一个节点类型的指针而已)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val){
typedef struct ListNode ListNode;
ListNode *shead;
shead = (ListNode*)malloc(sizeof(ListNode));
shead->next = head;
ListNode *p = shead;
while(p!=NULL&&p->next!=NULL){
ListNode *temp = p->next;
if(temp->val==val){
p->next = temp->next;
free(temp);
}else{
p = p->next;
}
}
head = shead->next;
free(shead);
return head;
}