Live2D

# 203.移除链表元素

## 题目描述

输入: 1->2->6->3->4->5->6, val = 6

1、删除点在开头；

2、删除点在结尾；

3、连续删除两个位置；

4、需delete手动释放内存；

1、头结点命中特殊处理；

2、引入虚拟头结点；

## 删除操作

1、两个指针完成删除；

2、一个指针完成删除；

### 方法一

/**
* 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 == NULL )

ListNode *p = head;
ListNode *pre = p;
while( p )
{
if( p->val == val )
{
if( pre == p )
{
pre = p;
}
else
{
pre->next = p->next;
p = p->next;
}
}
else
{
pre = p;
p = p->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 == NULL )

ListNode *res = new ListNode(0);
ListNode *p = head;
ListNode *pre = res;
while( p )
{
if( p->val == val )
pre->next = p->next;
else
pre = p;
p = p->next;
}

return res->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 == NULL )

ListNode *res = new ListNode(0);
ListNode *p = res;

while( p->next )
{
if( p->next->val == val )
{
ListNode *tmp = p->next;
p->next = p->next->next;
delete tmp;
}
else
p = p->next;
}

return res->next;
}
};


posted @ 2020-12-31 16:33  Christal_R  阅读(113)  评论(0编辑  收藏  举报