这道题目看起来很简单,但是实际操作起来并不容易,尤其需要考虑头结点重复修改头结点
这里说一下思路:直接声明一个ListNode **p = pHead用于修改结点
p最初指向头结点,当头结点重复时可以通过*p直接修改头结点 不重复时可以通过p = &(xxx)修改其指向的结点

class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        ListNode *tmp;
        bool flag = false;
        ListNode **p = &pHead;
        if(!pHead)
            return NULL;
        while(*p){
            int val = (*p)->val;
            flag = false;
            tmp = (*p)->next;
            while(tmp && tmp->val == val){
                flag = true;
                tmp = tmp->next;
            }
            //发生了重复 修改当前指向的结点为后面第一个不是val的结点
            if(flag){
                *p = tmp;
            }
            //没发生重复 修改p指向原本结点的next结点
            else{
                p = &((*p)->next);
            }
        }
        return pHead;
    }
};