class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode* res = new ListNode(0); //省去判断链表头重复的情况
        res->next = head;
        ListNode *pre = res, *cur = head; //记录前一个没重复的节点和当前节点
        while(cur && cur->next) { //后面元素少于2个则不会重复
            bool repeat = 0; //是否重复标志位
            while(cur->next && cur->next->val == pre->next->val) { //存在下一节点并且下一节点的值与pre后面的值(即接下来要判断是否重复的节点值)相同时
                repeat = 1; //设置标志位
                cur = cur->next; //当前节点前移直到重复节点的末尾
            }
            if(repeat) pre->next = cur->next; //当有重复时前一个没重复的节点指向末尾重复节点的下一位(可能为空指针)
            else pre = cur; //否则没重复节点前移
            cur = cur->next; //当前节点前移
        }
        return res->next;
    }
};