Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.
思路:这题算法不难,就是要注意头重复和尾重复的情况
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==NULL)//头为空
return NULL;
int count=0;
ListNode *p = head;
ListNode *q = p->next;
while(q){
//开头重复
if(p->val==q->val){
while(q->next && q->val==q->next->val)
q = q->next;
if(q->next == NULL)//所有的都重复
return NULL;
else{
p=q->next;
head=p;
q=p->next;
}
}
//头不重复
else{
while(q->next && q->val==q->next->val){
q = q->next;
count ++;
}
if(q->next == NULL){//结束了
if(!count)//尾不重复
return head;
else{//尾重复
//释放
ListNode *t = p->next;
while(t==q){
ListNode *tmp = t;
t = t->next;
delete tmp;
}
p->next=NULL;
return head;
}
}
else{
if(count){//存在重复
//释放
ListNode *t = p->next;
p->next=q->next;
while(t==q){
ListNode *tmp = t;
t = t->next;
delete tmp;
}
q = p->next;
count = 0;
}
else{//不存在重复
if(p==head){
p = q;
q = p->next;
head->next=p;
}
else{
p = q;
q = p->next;
}
}
}
}
}
return head;
}
};