class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        // 声明一个头结点 统一操作
        ListNode* pHead = new ListNode(-1);
        pHead->next = head;
        ListNode* pre = pHead; // 前驱指针 用于删除结点 
        ListNode* p = pre->next; // 当前工作指针
        while(p && p->next){ 
            if(p->val == p->next->val){ // 当前指针和下一个指针值相等 即重复
                ListNode* tmp = p->next; 
                while(tmp && tmp->val == p->val){
                    tmp = tmp->next; // 找到与当前指针值不同的节点,用于将中间重复节点删除
                }
                pre->next = tmp; // 删除
                p = pre->next; // 工作指针重新赋值
            }else{ // 不是重复节点 直接后移 不做删除操作
                p = p->next;
                pre = pre->next;
            }
        }
        return pHead->next; 
    }
};