/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @return ListNode类 */ struct ListNode* deleteDuplicates(struct ListNode* head ) { // write code here if (head == NULL || head->next == NULL) { return head; } struct ListNode* phead = NULL; //临时的头指针 struct ListNode* tail = head; //遍历的最快的指针 struct ListNode* tmp = NULL; //判断是和tail否是相同元素 struct ListNode* bottom = NULL; //新链表的尾指针 tmp = tail; tail = tail->next; while(tail != NULL) { if (tmp->val == tail->val) { //值相等 while(tail != NULL ) { if (tmp->val != tail->val) { tmp = tail; tail = tail->next; if (phead == NULL && tail == NULL) { phead = bottom = tmp; } break; } tail = tail->next; } } else { //值不同 if (phead == NULL) { phead = bottom = tmp; } else { bottom->next = tmp; bottom = tmp; } tmp = tail; tail = tail->next; } } //注意因为上面的循环会漏掉最后一个所以在下面再判断一次 if (bottom != NULL) { if (tmp->next == NULL && tmp->val != bottom->val) { bottom->next = tmp; bottom = tmp; } bottom->next = NULL; } head = phead; return head; }