微信扫一扫打赏支持

L2-002. 链表去重

L2-002. 链表去重

一、心得

 

二、题目及分析

L2-002. 链表去重

时间限制
300 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

给定一个带整数键值的单链表L,本题要求你编写程序,删除那些键值的绝对值有重复的结点。即对任意键值K,只有键值或其绝对值等于K的第一个结点可以被保留。同时,所有被删除的结点必须被保存在另外一个链表中。例如:另L为21→-15→-15→-7→15,则你必须输出去重后的链表21→-15→-7、以及被删除的链表-15→15。

输入格式:

输入第一行包含链表第一个结点的地址、以及结点个数N(<= 105 的正整数)。结点地址是一个非负的5位整数,NULL指针用-1表示。

随后N行,每行按下列格式给出一个结点的信息:

Address Key Next

其中Address是结点的地址,Key是绝对值不超过104的整数,Next是下一个结点的地址。

输出格式:

首先输出去重后的链表,然后输出被删除结点组成的链表。每个结点占一行,按输入的格式输出。

输入样例:
00100 5
99999 -7 87654
23854 -15 00000
87654 15 -1
00000 -15 99999
00100 21 23854
输出样例:
00100 21 23854
23854 -15 99999
99999 -7 -1
00000 -15 87654
87654 15 -1

三、代码及结果

  1 //L2-002. 链表去重
  2 /*
  3 输入得到的是乱序链表,排个顺序让它成为正常的序列
  4 然后开始输出链表,用集合set来辅助看是不是绝对之已经输出过,如果是,就放在删除链表所在的链 
  5 */
  6 
  7 #include <iostream>
  8 #include <algorithm> 
  9 #include <set>
 10 #include <cmath>//abs函数 
 11 using namespace std;
 12 
 13 string firstAdd;
 14 int n;
 15 struct node{
 16     string add;
 17     int value;
 18     string next;
 19     int sortNul;
 20     int vis;
 21 }a[10005],b[10005],d[10005]; 
 22 
 23 bool operator <(const node &p,const node &p1){
 24     return p.sortNul<p1.sortNul;
 25 }
 26 
 27 
 28 
 29 //读入数据 
 30 void readData(){
 31     cin>>firstAdd>>n;
 32     for(int i=1;i<=n;i++){
 33         cin>>a[i].add>>a[i].value>>a[i].next;
 34         a[i].sortNul=0;
 35         a[i].vis=0;
 36     }
 37 } 
 38 
 39 void printData(){
 40     for(int i=1;i<=n;i++){
 41         cout<<a[i].add<<" "<<a[i].value<<" "<<a[i].next<<" "<<a[i].sortNul<<endl;
 42     }
 43 }
 44 
 45 //让链表sortNum编号有序
 46 void findSortNum(){
 47     string next(firstAdd);
 48     for(int i=1;i<=n;i++){
 49         for(int j=1;j<=n;j++){
 50             if(!a[j].vis&&a[j].add==next){
 51                 a[j].sortNul=i;
 52                 a[j].vis=1;
 53                 next=a[j].next;
 54                 break;
 55             }
 56         }
 57     }
 58 } 
 59 
 60 //找到 去重链表b 和 删除链表 d 
 61 set<int> set1;
 62 int b1=0,d1=0;
 63 void findAns(){
 64     for(int i=1;i<=n;i++){
 65         if(!set1.count(abs(a[i].value))){
 66             set1.insert(abs(a[i].value));
 67             b[++b1]=a[i];
 68         } 
 69         else{
 70             d[++d1]=a[i];
 71         }
 72     }
 73     //修正链表
 74      for(int i=1;i<b1;i++){
 75          b[i].next=b[i+1].add;
 76      } 
 77      b[b1].next="-1";
 78      
 79      for(int i=1;i<d1;i++){
 80          d[i].next=d[i+1].add;
 81      } 
 82      d[d1].next="-1";
 83 }
 84 
 85 //输出去重链表和 删除链表 
 86 void printAns(){
 87     for(int i=1;i<=b1;i++){
 88         cout<<b[i].add<<" "<<b[i].value<<" "<<b[i].next<<endl;
 89     }
 90     for(int i=1;i<=d1;i++){
 91         cout<<d[i].add<<" "<<d[i].value<<" "<<d[i].next<<endl;
 92     }
 93 } 
 94 
 95 
 96 int main(){
 97     //freopen("in.txt","r",stdin);
 98     readData();
 99     findSortNum();
100     sort(a+1,a+n+1);
101     //printData();
102     findAns();
103     //cout<<"-----------------------------------------"<<endl; 
104     printAns();
105     return 0;
106 } 

 

posted @ 2017-07-20 17:26  范仁义  阅读(480)  评论(0编辑  收藏  举报