-
ListNode* dummyHead = new ListNode(0);
:创建一个虚拟头结点,其值为 0,这个节点的作用是为了方便处理头结点可能是需要删除的情况dummyHead->next = head;
:将虚拟头结点的指针指向原始链表的头结点
-
遍历链表并移除指定值的节点:
- 使用 初始化一个指针 ,从虚拟头结点开始遍历链表。
ListNode* cur = dummyHead;
cur
- 在 循环中,检查当前节点的下一个节点是否为需要删除的节点:
while
- 如果 ,则删除该节点,更新 指针,并释放被删除节点的内存。
cur->next->val == val
cur->next
- 否则,继续移动 指针到下一个节点。
- 如果 ,则删除该节点,更新 指针,并释放被删除节点的内存。
- 使用 初始化一个指针 ,从虚拟头结点开始遍历链表。
-
更新头结点并释放虚拟头结点:
head = dummyHead->next;
:更新头结点为新的链表头(即跳过所有以 开始的节点)。val
delete dummyHead;
:释放虚拟头结点的内存,避免内存泄漏。
-
返回结果:
- 最后返回处理后的链表头结果、
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
// 创建一个虚拟头结点(dummy node),它的 next 指向原始链表的头结点
// 这样可以方便处理头结点本身需要被删除的情况
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
// 使用当前指针 cur 从虚拟头结点开始遍历链表
ListNode* cur = dummyHead;
// 遍历链表,处理非头结点部分
while (cur->next != NULL) {
// 如果当前节点的下一个节点值为 val,则移除该节点
if (cur->next->val == val) {
ListNode* temp = cur->next; // 保存要删除的节点
cur->next = cur->next->next; // 跳过要删除的节点
delete temp; // 释放被删除节点的内存
} else {
cur = cur->next; // 继续检查下一个节点
}
}
// 更新头结点为新的链表头(跳过所有以 val 开始的节点)
head = dummyHead->next;
// 释放虚拟头结点的内存,避免内存泄漏
delete dummyHead;
// 返回处理后的链表头结点
return head;
}
};