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

#include <iostream>
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<<cur->data<<" ";
		cur=cur->next;
	}
	cout<<endl;
}
//删除有序链表重复的值
void DeleteReValue(Node** pHead)
{
	if(pHead==NULL||*pHead==NULL||(*pHead)->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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值