/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param head ListNode类
 * @return ListNode类
 */
struct ListNode* deleteDuplicates(struct ListNode* head ) {
    // write code here
    struct ListNode* temp = NULL;
    struct ListNode* last = temp;	//新链表的初始化
    struct ListNode* p = head;
    struct ListNode* q = NULL;
    if (head == NULL || head->next == NULL)		//特殊情况
        return head;
    q = p;
    p = p->next;
    int data;
    while (p) 
    {
        if (q->val == p->val) 		//相同时
        {
            while (1) 
            {
                if (p->val != q->val) 
                {
                    q->next = NULL;
                    q = p;
                    p = p->next;
                    if (p == NULL)      //当最后一个结点为不同时出现的情况
                    {
                        if (temp == NULL) 
                        {
                            temp = q;
                            last = q;
                        } 
                        else 
                        {
                            last->next = q;
                            last = q;
                        }
                    }
                    break;
                } 
                else 
                {
                    q = p;
                    p = p->next;
                    if (p == NULL)  //q跟随p结点直至p为空时,它们依旧相等的情况
                        break;
                }
            }
        } 
        else 		//不同时
        {
            q->next = NULL;
            if (temp == NULL) 
            {
                temp = q;
                last = q;
            } 
            else 
            {
                last->next = q;
                last = q;
            }
            q = p;
            p = p->next;
            if (p == NULL) 
            {
                last->next = q;
                last = q;
            }
        }
    }
    return temp;
}