您的位置:首页 > 其它

链表逆转以及删除所有重复元素

2014-11-24 11:46 435 查看
1,没有多余的头结点;

2,Map是判断冗余的好工具;

3,追求简洁会让逻辑更加明确有力。

#include <iostream>
#include <map>

using namespace std;

struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};

ListNode *reverse(ListNode *root){
ListNode *p=NULL,*tmp;
while(root!=NULL){
tmp=root->next;
root->next=p; //two simple but key sentences
p=root;
root=tmp;
}
return p;
}

ListNode *deleteDuplicates(ListNode *head) {
if(head==NULL) return NULL;
map<int,int> map;
ListNode *p=head;
ListNode *pre= NULL;
while(p!=NULL) {map[p->val]++;p=p->next;}

p=head;//reset p to head
bool flag=false;
while(p!=NULL){
if(map[p->val]>1){
int num=map[p->val];
if(p==head) flag=true;
while(num--) p=p->next;
if(flag){head=p;flag=false;}//because the head are changed , reset head to the current p
pre->next=p;
}
else{
pre=p;
p=p->next;
}
}
return head;
}

int main() {
// your code goes here
int num;
ListNode *p,*q;
ListNode *root=NULL;

while(cin>>num){
p=new ListNode(num);
p->next=root;
root=p;
}cout<<endl;
p=root;

p=reverse(root);

while(p!=NULL) {
cout<<p->val<<" ";
p=p->next;
}cout<<endl;

p=deleteDuplicates(root);

while(p!=NULL) {
cout<<p->val<<" ";
p=p->next;
}

return 0;
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: