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

来源:互联网 发布:chrome json 插件 编辑:程序博客网 时间:2024/05/19 18:18
#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;}