Remove all elements from a linked list of integers that have value val.
Example
Given: 1 –> 2 –> 6 –> 3 –> 4 –> 5 –> 6, val = 6
Return: 1 –> 2 –> 3 –> 4 –> 5
思路1
爲了最後能return修改後的鏈表,所以我們創建了一個總頭dummy,來指向原來鏈表的head,然後再創造倆個指針,一前一後用來比較
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* p = dummy;
ListNode* q = head;
while(q!=NULL)
{
if(q->val == val)
p->next = q->next;
else
p = p->next;
q = q->next;
}
return dummy->next;
}
};
思路2
和上面相反的方法,不用記錄Head
新建一個指針來代替head移動,然後釋放刪除節點。最後再比較第一個節點,然後正好返回Head
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
if (head==NULL){
return head;
}
ListNode* p=head;
while(p->next!=NULL){
if (p->next->val == val){
auto freeNode = p->next;
p->next = p->next->next;
free(freeNode);
}
else{
p=p->next;
}
}
if (head->val==val)
head=head->next;
return head;
}
};
思路3
遞歸撒
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
if (head == NULL) return NULL;
if (val == head->val) return removeElements(head->next,val);
head->next = removeElements(head->next,val);
return head;
}
};