删除链表中等于给定值 val 的所有节点。
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4
1. 存入vector后套用删除重复的函数
ListNode* removeElements(ListNode* head, int val) {
vector<int> a;
ListNode *p = head;
while(p!=NULL)
{
a.push_back(p->val);
p = p->next;
}
a.erase(remove(a.begin(),a.end(),val),a.end());
int num = a.size();
ListNode *pp = new ListNode(NULL);
p = pp;
for(int i =0;i<num;i++)
{
ListNode *np = new ListNode(NULL);
pp->next = np;
np->val = a[i];
pp = np;
}
return p->next;
}
2. 单指针,head特殊处理
ListNode* removeElements(ListNode* head, int val) {
if(head == NULL) return head;
ListNode * p = head;
while(p->next != NULL)
{
if(p->next->val == val)
{
p->next = p->next->next;
}
else
{
p = p->next;
}
}
if(head->val == val) head = head->next;//最后处理第一个元素
return head;
}
3. 双指针,构造新头节点
ListNode* removeElements(ListNode* head, int val) {
if (!head) return head;
ListNode* dummy =new ListNode(-1);
dummy->next = head;
ListNode* p = dummy;
while (head){
if (head->val == val){
head = head->next;
p->next = head;
}
else{
p = p->next;
head = head->next;
}
}
return dummy->next;
}
4. 单指针,先处理头节点
ListNode* removeElements(ListNode* head, int val)
{
while(head && head->val == val)
head = head->next;
if(head == NULL)
return head;
ListNode* first = head;
while(first && first->next)
{
if(first->next->val == val)
{
first->next = first->next->next;
}
else
first = first->next;
}
return head;
}
5. 将需要的元素添加到新的链表
ListNode* removeElements(ListNode* head, int val) {
ListNode *L=new ListNode(-1);
ListNode *l1=L;
while(head)
{
if(head->val==val)
head=head->next;
else
{
ListNode *p=new ListNode(head->val);
l1->next=p;
l1=l1->next;
head=head->next;
}
}
return L->next;
}
6. 递归删除
ListNode* removeElements(ListNode* head, int val) {
if (!head)
return head;
head->next = removeElements(head->next, val);
return head->val == val ? head->next : head;
}