删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3->4->5
简单删除
注意头结点的处理和节点回收。
/**
* 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) {
if(!head)
return head;
while(head->val==val)
{
if(head->next==NULL)
return NULL;
head=head->next;
}
ListNode* index=head->next;
ListNode* pre=head;
ListNode* toDelete=NULL;
while(index!=NULL)
{
if(index->val==val)
{
toDelete=index;
pre->next=index->next;
index=index->next;
delete toDelete;
toDelete=NULL;
}
else
{
pre=index;
index=index->next;
}
}
return head;
}
};
sentinel(哨兵)
在头结点前面设置哨兵,方便数据删除
/**
* 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* sentinel=new ListNode(0);
sentinel->next=head;
ListNode* index=head;
ListNode* pre=sentinel;
ListNode* toDelete=NULL;
while(index!=NULL)
{
if(index->val==val)
{
toDelete=index;
pre->next=index->next;
index=index->next;
delete toDelete;
toDelete=NULL;
}
else
{
pre=index;
index=index->next;
}
}
return sentinel->next;
}
};
递归
其实就是从链表尾部往前判断删除。
/**
* 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) {
if(head==nullptr)
return nullptr;
head->next=removeElements(head->next,val);
if(head->val==val)
return head->next;
else
return head;
}
};