题目
给你一个链表的头节点 h e a d head head 和一个整数 v a l val val ,请你删除链表中所有满足 N o d e . v a l = = v a l Node.val == val Node.val==val 的节点,并返回 新的头节点 。
- 示例
输入:
h
e
a
d
=
[
1
,
2
,
6
,
3
,
4
,
5
,
6
]
,
v
a
l
=
6
head = [1,2,6,3,4,5,6], val = 6
head=[1,2,6,3,4,5,6],val=6
输出:
[
1
,
2
,
3
,
4
,
5
]
[1,2,3,4,5]
[1,2,3,4,5]
思路
- 思路一:使用虚拟头节点迭代删除指定元素
首先创建一个虚拟头节点
d
u
m
m
y
N
o
d
e
dummyNode
dummyNode , 使其指向给定的第一个节点,因为第一个节点也有可能是需要删除的节点,因此我们需要创建一个虚拟的头节点来指向它。
接着我们开始遍历分别判断是否等于
v
a
l
val
val 值,如果等于则删除该节点,否则结点指向向前移动一位。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
if(head == nullptr){
return nullptr;
}
//创建虚拟头节点
ListNode* dummy_node = new ListNode(-1,head);
ListNode* current = dummy_node;
while(current -> next != nullptr){
ListNode* nextNode1 = current -> next;
if(nextNode1 -> val == val){
//删除该节点
current -> next = nextNode1 -> next;
delete nextNode1;
}else{
current= current -> next;
}
}
return dummy_node -> next;
}
};
- 思路二:使用递归删除
由于链表本身具有递归的性质,因此我们可以使用递归的方式对其进行删除。首先删除第一个节点以外的其余节点,最后判断第一个节点是否是需要删除的节点,如果是我们就返回
h
e
a
d
−
>
n
e
x
t
head -> next
head−>next,否则我们就返回
h
e
a
d
head
head 。
首先我们给出递归结束的条件,
h
e
a
d
!
=
n
u
l
l
head != null
head!=null ,接着我们开始向后移动直到头节点为空。
在此时我们开始进行返回,从后向前进行判断那个节点需要删除,我们以
h
e
a
d
−
>
v
a
l
=
=
v
a
l
head -> val == val
head−>val==val 为判断条件。如果需要删除,我们就将该节点的下一个节点作为返回值返回给上一个节点的指向。
如上图所示,我们将节点值为 5 的节点的
n
e
x
t
next
next 值赋为要删除节点的
n
e
x
t
next
next值,假设最后要处理的头节点为要删除的节点,我们直接将它的下一个节点作为结果返回。
如图所示,我们可将节点值为
3
3
3 的节点作为该链表的第一个节点进行返回。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
if(head == nullptr){
return head;
}
head -> next = removeElements(head -> next,val);
if(head -> val == val){
//删除该节点
return head -> next;
}else{
//不进行删除
return head;
}
}
};