剑指offer-删除链表重复节点

#include 
using namespace std;
struct Node
{
	int data;
	Node* next;

	Node(int x)
		:data(x)
		,next(NULL)
	{}
};

void PushBack(Node** pHead,int x)
{
	if(*pHead==NULL)
	{
		*pHead=new Node(x);
	}
	else
	{
		Node* cur=*pHead;
		while(cur->next)
		{
			cur=cur->next;
		}
		cur->next=new Node(x);
	}
}

void Print(Node* pHead)
{
	Node* cur=pHead;
	while(cur)
	{
		cout<data<<" ";
		cur=cur->next;
	}
	cout<next==NULL)  //链表为空或只有一个节点直接返回
		return;
	Node* prev=NULL;    //标记当前结点前一个
	Node* cur=*pHead;   //标记当前结点
	while(cur)
	{
		Node* pNext=cur->next;  //标记下一个结点
		
		if(pNext && pNext->data!=cur->data)   //若当前结点与下一个结点不重复
		{
			prev=cur;                //标记当前结点前一个结点
			cur=pNext;              //当前结点走下一个
		}
		else if(pNext && pNext->data==cur->data)   //若当前结点与下一个结点重复
		{
			Node* del=cur;          //从当前节点开始删除重复节点
			int value=cur->data;
			while(del && del->data==value)    //删除停止时间是直到删除的节点值不为重复结点的值
			{
				pNext=del->next;   //用pNext做中间转换值
				delete del;
				del=pNext;
			}   //完成以后pNext指向不重复节点值的第一个

			if(prev)
				prev->next=pNext;    //若头结点不重复,将以前标记的前一个节点直接与pNext连接
			else
				*pHead=pNext;   //头结点重复则改正头节点

			cur=pNext;    //当前结点从pNext再次开始
		} 

		//cur=pNext;
	}
}
int main()
{
	Node* pHead=NULL;
	PushBack(&pHead,0);
	PushBack(&pHead,0);
	PushBack(&pHead,1);
	PushBack(&pHead,2);
	PushBack(&pHead,3);
	PushBack(&pHead,3);
	PushBack(&pHead,4);
	PushBack(&pHead,4);
	PushBack(&pHead,5);
	PushBack(&pHead,6);
	PushBack(&pHead,6);
	PushBack(&pHead,6);
	Print(pHead);
	DeleteReValue(&pHead);
	Print(pHead);
	system("pause");
	return 0;
}

你可能感兴趣的:(面试题,剑指offer面试题)