第八题 删除重复的 难点在于连续出现重复的while循环里 会遇到 数组结束的边界问题
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead) {
        if(pHead==NULL)
            return pHead;
        // 好像例子是按顺序增长的
        // 如果不增长 就是用map 出现过就跳掉
        
        // 保存pre结点,如果一样 就要处理跳过的代码
        ListNode *ans=new ListNode(0);
        ans->next=pHead;
        ListNode *pre = ans;
        while(pHead!=NULL)
        {
            // 如果不相等 这两个往后走
            if(pHead->next != NULL && pHead->val != pHead->next->val){
                pHead=pHead->next;
                pre=pre->next;
            }
            
            // 相等了就要往后找到第一个不想等的
            // 这里可能会相等到结尾 要注意判断
            else{
                // 如果说pHead后面没有了,ans后面就结束了,直接返回
                if (pHead->next == NULL)
                    return ans->next;
                
                // 不然就说明这里有相等发生了
                // pHead如果和后面都是相等的 就循环往后走 不如说 233333456 那么中间的3都要跳过
                // 如果说循环到后面23333就结束了,那么pHead就和上面一样 pHead 后面不会再有 退出循环
                while(pHead->next!=NULL && pHead->val==pHead->next->val){
                    pHead=pHead->next;
                }
                pHead=pHead->next;
                pre->next=pHead;
            }
        }
        return ans->next;
    }
};