struct ListNode* deleteDuplicates(struct ListNode* head ) {
    // write code here
    struct ListNode *pre,*nxt,*prePre;
    if(head==NULL||head->next==NULL)
        return head;
    
    pre=head;
    prePre=head;
    nxt=pre->next;
    
    int flag=0;//判断结点是否为重复结点的标志
    while(pre!=NULL)
    {
        if(nxt!=NULL&&pre->val==nxt->val)
        {
            pre->next=nxt->next;
            free(nxt);
            nxt=pre->next;
            flag=1;
        }
        
        else
        {
          if(flag)//结点为重复结点的情况
          {
                if(pre==head)//待删除的结点为头结点的情况
                {
                    head=pre->next;
                    free(pre);
                    pre=head;
                    if(nxt==NULL)
                         break;
                    nxt=pre->next;
                }
                 else
                {
                     free(pre);
                     prePre->next=nxt;
                     pre=prePre->next;
                     if(nxt==NULL)
                         break;
                     nxt=nxt->next;
                 }     
          }
            
          else
          {
              prePre=pre;
              pre=pre->next;
              if(nxt==NULL)
                         break;
              nxt=nxt->next; 
          }
          flag=0;
        }
    }
    return head;
}