#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;
}
剑指offer-删除链表重复节点
最新推荐文章于 2020-05-30 11:04:42 发布