/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
  public:
    ListNode* deleteDuplication(ListNode* pHead) {
        if (!pHead || !pHead->next) return pHead ;

        ListNode* prev = new ListNode(0), * cur = pHead, * next = pHead->next;
        prev->next = cur ;
        ListNode* node = prev ;

        bool nee_dele = false ;

        while (next != nullptr) {
            if (cur->val == next->val) {
                next = next->next ;
                nee_dele = true ;
            } else if ((cur->val != next->val) && (nee_dele)) {
                prev->next = next ;
                cur = next ;
                next = next->next ;
                nee_dele = false ;
            } else {
                prev->next = cur ;
                prev = prev->next ;
                cur = cur->next ;
                next = next->next ;
            }
        }

        if (nee_dele) prev->next = next ;

        return node->next ;

    };
};