《剑指offer》:[57]删除链表中重复的结点
来源:程序员人生 发布时间:2016-08-15 08:56:31 阅读次数:2244次
题目:在1个排序的链表中,如何删除重复的结点?
例如,在图a中重复结点被删除以后,链表如图b所示。
方案:这个题应当说是比较简单的,不在赘述,主要利用3个指针,就能够解决这个问题。
具体实现代码:
#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//非空链表;
{
// 插入在头结点;
if(pHead->data > data )
{
pNode->next=pHead;
pHead=pNode;
}
// 插入位置在非头结点;
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)//必须**,由于有可能删除头结点;
{
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;
}
运行结果:
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠