给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:

**输入:**head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:
**输入:**head = [], val = 1
输出:[]
示例 3:
**输入:**head = [7,7,7,7], val = 7
输出:[]
提示:
- 列表中的节点数目在范围
[0, 104] 内
1 <= Node.val <= 50
0 <= val <= 50
使用delete/new来分配内存。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* n_head=nullptr;
ListNode *p1=head,*p2=head,*p=nullptr;
if(head==nullptr) return n_head;
while(p1!=nullptr)
{
ListNode *p = new ListNode(p1->val);
if(p1->val != val)
{
if(n_head == nullptr) {
n_head=p;
p2=n_head;
}
else
{
p2->next = p;
p2=p;
}
}
p1=p1->next;
}
return n_head;
}
};
|
虚拟头节点:为统一头节点删除操作,简化代码流程,可以引入一个虚拟头节点dummy_head。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummy_head = new ListNode(0);
dummy_head->next = head;
ListNode *cur = dummy_head;
while(cur->next != nullptr)
{
if(cur->next -> val == val)
{
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
}
else
cur = cur ->next;
}
head = dummy_head ->next;
delete dummy_head;
return head;
}
};
|
![[Pasted image 20250405101714.png]]