力扣:203. 移除鏈表元素
題目:
203. 移除鏈表元素
難度簡單1198
給你一個鏈表的頭節(jié)點?head
?和一個整數(shù)?val
?,請你刪除鏈表中所有滿足?Node.val == val
?的節(jié)點,并返回?新的頭節(jié)點?。
?
示例 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輸出:[]
?
提示:
列表中的節(jié)點數(shù)目在范圍?
[0, 104]
?內1 <= Node.val <= 50
0 <= val <= 50
兩種做法:
第一種對法:(先處理頭指針)
注意:
判斷循環(huán)是否會操作空指針,設置好循環(huán)條件避免操作空指針
先處理頭指針,處理好之后記得跳出循環(huán)
/**
?*?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;
}
第二種對法:(虛擬頭節(jié)點)
注意:
創(chuàng)建一個虛擬頭節(jié)點,創(chuàng)建之后還要為他分配空間(不然他就只是一個節(jié)點類型的指針而已)
/**
?*?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;
}