剑指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; }
相关文章推荐
- 剑指offer之删除链表中重复的节点
- 剑指offer 57 - 删除链表中重复的节点
- 剑指Offer—56—删除链表中重复的节点
- 【剑指offer-解题系列(57)】删除链表中重复的节点
- 剑指offer-57:删除链表中重复节点
- 8.剑指offer-删除链表中重复节点
- 剑指offer_删除链表中重复的节点
- 剑指Offer--删除链表中重复的节点
- 剑指offer(LintCode):112. 删除链表中重复节点I VS 113.删除链表中重复节点II
- 【剑指offer】面试题18:删除链表中重复的节点
- 剑指offer之面试题13:在O(1)时间删除链表节点
- 剑指offer--面试题13:在O(1)时间删除链表节点
- 剑指Offer-删除链表中重复的结点-java
- 剑指offer之删除链表节点
- 剑指offer—删除链表中重复的结点
- 剑指offer 删除链表中重复的结点
- 剑指offer-删除链表中重复的结点
- 剑指offer57道题(删除链表中的重复结点)
- 剑指offer13-在O(1)时间删除链表节点
- 剑指offer--删除重复节点