/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* helper = new ListNode(-1);
        helper->next = head;
        auto curr = helper;
        while(curr->next)
        {
            while(curr->next && curr->next->val != val)
                curr = curr->next;
            if(!curr->next)break;
            auto tmp = curr->next;
            curr->next = tmp->next;
            tmp->next = nullptr;
        }
        return helper->next;
    }
};