本题源自剑指offer
--------------------------------------------------------------------------------------
要删除重复的节点,既要保留重复节点的前一个节点和后一个节点,然后让前一个节点指向后一个节点。
ListNode* deleteDuplication(ListNode* pHead)
{
if(pHead==NULL||pHead->next==NULL)
return pHead;
ListNode* pre=NULL;
ListNode* p=pHead;
while(p!=NULL){
ListNode* pNext=p->next;
bool flag=false;
if(pNext!=NULL&&(p->val==pNext->val)){
flag=true;
}
if(flag){
ListNode* pDel=p;
int tmp=pDel->val;
while(pDel!=NULL&&pDel->val==tmp){
pNext=pDel->next;
delete pDel;
pDel=NULL;
pDel=pNext;
}
if(pre==NULL){
pHead=pNext;
}else{
pre->next=pNext;
}
p=pNext;
}else{
pre=p;
p=pNext;
}
}
return pHead;
}
代码2
构造头结点,然后再删除
ListNode* deleteDuplication(ListNode* pHead)
{
if(pHead==NULL||pHead->next==NULL)
return pHead;
int first=0;
if(first==pHead->val)
first=-1;
ListNode* head=new ListNode(first);
head->next=pHead;
ListNode* pre=head;
ListNode* p=pHead;
while(p!=NULL){
while(p->next!=NULL && (p->val==p->next->val)){
ListNode* del=p;
delete del;
del=NULL;
p=p->next;
}
if(pre->next!=p){
p=p->next;
pre->next=p;
}else{
pre=p;
p=p->next;
}
}
pHead=head->next;
delete head;
head=NULL;
return pHead;
}