链表逆转以及删除所有重复元素
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;
}
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;
}
相关文章推荐
- 给定一个排序链表,删除所有重复的元素每个元素只留下一个。
- 链表所有重复元素的删除
- 删除链表中所有值相同的多余元素
- 寒假第二天--线性表--数据结构实验之链表七:单链表中重复元素的删除
- CareerCup之2.1无序链表删除重复元素
- 数据结构实验之链表七:单链表中重复元素的删除
- 数据结构实验之链表七:单链表中重复元素的删除
- 面试题精选(84):使序列有序的最少交换次数(minimum swaps) + 删除序列中所有重复的元素
- 数据结构实验之链表七:单链表中重复元素的删除
- 数据结构实验之链表七:单链表中重复元素的删除
- 删除链表中重复的元素
- 数据结构实验之链表七:单链表中重复元素的删除
- Leetcode 删除重复的链表元素
- Remove Duplicates from Sorted List II 删除链表中的元素(不保留重复)
- ArrayList 的删除重复元素以及删除
- 2.1 链表重复元素(删除)
- 数据结构--删除单链表中重复元素
- 单链表中重复元素的删除
- 数据结构实验之链表七:单链表中重复元素的删除
- 数据结构实验之链表七:单链表中重复元素的删除