Eliminar Elementos de una Lista Ligada

Este problema consiste en, dada la cabeza de una lista ligada y un entero val, eliminar todos los nodos de la lista cuyo valor sea igual a val y regresar la nueva cabeza de la lista.

Solución

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        while (head && head->val == val)
            head = head->next;

        ListNode* ans = head;
        while (ans && ans->next) {
            if (ans->next->val == val)
                ans->next = ans->next->next;
            else
                ans = ans->next;
        }
        return head;
    }
};

Primero se eliminan los nodos del inicio que tengan el valor buscado, avanzando la cabeza. Después se recorre la lista con un apuntador ans: si el siguiente nodo tiene el valor, se salta enlazando ans->next con el siguiente del siguiente; en caso contrario se avanza. Finalmente se regresa la cabeza actualizada.