203. 移除链表元素

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 使用一个哑节点(dummy node)来简化边界情况的处理
        ListNode* dummy = new ListNode(-1);
        dummy->next = head;

        ListNode* prev = dummy; // 使用 prev 指针来遍历链表,始终指向当前节点的前一个节点
        while(prev->next != nullptr) {
            if (prev->next->val == val) {
                ListNode* toDelete = prev->next; // 需要删除的节点
                prev->next = toDelete->next; // 从链表中移除节点
                delete toDelete; // 释放节点内存
            } else {
                prev = prev->next; // 只有当不删除节点时才移动 prev 指针
            }
        }

        head = dummy->next; // 更新头节点(考虑头节点可能被删除的情况)
        delete dummy; // 删除哑节点并释放内存
        return head;
    }
};