在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
ListNode* deleteDuplication(ListNode* pHead) {
struct ListNode* prev, *cur, *next, *tmp;
if (pHead == NULL || pHead->next == NULL) {
return pHead;
}
prev = NULL;
cur = pHead;
next = cur->next;
while (next) {
if (cur->val != next->val) {
prev = cur;
cur = next;
next = next->next;
}
else {
//找到第一个不重复的结点
while (next&&next->val == cur->val) {
next = next->next;
}
//释放重复区间
while (cur != next) {
tmp = cur->next;
free(cur);
cur = tmp;
}
//重新连接
if (prev == NULL) {
//删除的是头结点,更新头结点
pHead = cur;
}
else {
prev->next = cur;
}
if (next) {
next = next->next;
}
}
}
return pHead;
}
}