《劍指offer》:[57]刪除鏈表中重復(fù)的結(jié)點
來源:程序員人生 發(fā)布時間:2016-08-15 08:56:31 閱讀次數(shù):2415次
題目:在1個排序的鏈表中,如何刪除重復(fù)的結(jié)點?
例如,在圖a中重復(fù)結(jié)點被刪除以后,鏈表如圖b所示。

方案:這個題應(yīng)當說是比較簡單的,不在贅述,主要利用3個指針,就能夠解決這個問題。
具體實現(xiàn)代碼:
#include <iostream>
using namespace std;
struct ListNode
{
int data;
ListNode *next;
};
ListNode *pHead=NULL;
ListNode *pEnd=NULL;
void CreateList()
{
int data;
cin>>data;
while(0!=data)
{
ListNode *pNode=new ListNode;
pNode->data=data;
pNode->next=NULL;
if(pHead==NULL)//空鏈表
{
pHead=pNode;
pEnd=pNode;
}
else//非空鏈表;
{
// 插入在頭結(jié)點;
if(pHead->data > data )
{
pNode->next=pHead;
pHead=pNode;
}
// 插入位置在非頭結(jié)點;
else
{
ListNode *p=pHead;
while(p->next&& p->data<data)
p=p->next;
pNode->next=p->next;
p->next=pNode;
}
}
cin>>data;
}
}
void DeleteDuplication(ListNode **head)//必須**,由于有可能刪除頭結(jié)點;
{
if(head==NULL || *head==NULL)
return ;
ListNode *preNode=NULL;
ListNode *pNode=*head;
while(pNode!=NULL)
{
ListNode *pNext=pNode->next;
bool needdelete=false;
if(pNext!=NULL && pNext->data==pNode->data)
needdelete=true;
if(!needdelete)
{
preNode=pNode;
pNode=pNode->next;
}
else
{
int data=pNode->data;//記錄下要刪除的值;
ListNode *tobedel=pNode;
while(tobedel!=NULL && tobedel->data==data)
{
pNext=tobedel->next;
delete tobedel;
tobedel=NULL;
tobedel=pNext;
}
if(preNode==NULL)
*head=pNext;
else
preNode->next=pNext;
pNode=pNext;
}
}
}
void show(ListNode *head)
{
while(head)
{
cout<<head->data<<" ";
head=head->next;
}
cout<<endl;
}
int main()
{
CreateList();
DeleteDuplication(&pHead);
show(pHead);
system("pause");
return 0;
}
運行結(jié)果:

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈