码迷,mamicode.com
首页 > 其他好文 > 详细

《剑指offer》:[57]删除链表中重复的结点

时间:2016-06-29 11:24:21      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:

题目:在一个排序的链表中,如何删除重复的结点?

例如,在图a中重复结点被删除之后,链表如图b所示。

技术分享

方案:这个题应该说是比较简单的,不在赘述,主要利用三个指针,就可以解决这个问题。
具体实现代码:
#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;
}

运行结果:

技术分享


《剑指offer》:[57]删除链表中重复的结点

标签:

原文地址:http://blog.csdn.net/gogokongyin/article/details/51776732

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!