class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
// 创建一个虚拟头节点,它的值可以是任意值,这里设置为0
ListNode* dummyHead = new ListNode(0);
// 将虚拟头节点的next指针指向链表的头节点
dummyHead->next = head;
// 初始化当前节点指针cur,指向虚拟头节点
ListNode* cur = dummyHead;
// 当当前节点的下一个节点不为空时,继续循环
while (cur->next != NULL) {
// 如果当前节点的下一个节点的值等于要删除的值val
if(cur->next->val == val) {
// 保存要删除的节点
ListNode* tmp = cur->next;
// 将当前节点的next指针指向要删除节点的下一个节点
cur->next = cur->next->next;
// 删除要删除的节点
delete tmp;
} else {
// 如果当前节点的下一个节点的值不等于val,则移动当前节点指针
cur = cur->next;
}
}
// 此时dummyHead的next指针指向的是处理后的链表的头节点
head = dummyHead->next;
// 删除虚拟头节点
delete dummyHead;
// 返回处理后的链表的头节点
return head;
}
};
代码解释:
-
虚拟头节点:
ListNode* dummyHead = new ListNode(0);
:创建一个虚拟头节点dummyHead
,它的值设置为0(这个值不重要,只是为了初始化)。虚拟头节点的目的是简化删除操作,特别是当要删除的节点是头节点时。
-
初始化指针:
dummyHead->next = head;
:将虚拟头节点的next
指针指向链表的头节点head
。ListNode* cur = dummyHead;
:初始化一个指针cur
,指向虚拟头节点。
-
遍历链表:
while (cur->next != NULL)
:循环条件是cur
的下一个节点不为空,即还没有到达链表的末尾。- 在循环内部:
if(cur->next->val == val)
:检查cur
的下一个节点的值是否等于要删除的值val
。- 如果是,执行以下步骤:
ListNode* tmp = cur->next;
:保存要删除的节点。cur->next = cur->next->next;
:将cur
的next
指针指向要删除节点的下一个节点,从而从链表中移除要删除的节点。delete tmp;
:删除并释放要删除节点的内存。
- 如果不是,执行以下步骤:
cur = cur->next;
:将cur
移动到下一个节点。
-
返回新链表:
head = dummyHead->next;
:更新head
,使其指向处理后的链表的头节点(即虚拟头节点的下一个节点)。delete dummyHead;
:删除虚拟头节点,释放其内存。return head;
:返回处理后的链表的头节点。