您的位置:首页 > Web前端

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

2017-06-23 23:16 459 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: