zoukankan      html  css  js  c++  java
  • L2-002. 链表去重---模拟

    https://www.patest.cn/contests/gplt/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

    分析:(模拟)
    00100-23854-00000-99999-87654-(-1)
    21 -15 -15 -7 15
    建立结点模型

    struct node{
    int value;
    int next;
    };

    首先建立完整链表,在根据调节分开。

    
    
    #include "cstdio"
    #include "map"
    #include "cmath"
    #include "vector"
    #include "iostream"
    using namespace std;
    struct node{
        int value;
        int next;
    };
    map<int,node> map1;///通过map记录各节点信息,可凭地址快速访问
    map<int,int> sta;///判断值是否重复
    vector<int> v1;///去重后的链表结点依次地址
    vector<int> v2;///被删除链表各节点的地址
    int main()
    {
        int address,n;
        while(~scanf("%d%d",&address,&n))
        {
            ///初始化数据
            node node_temp;
            int ad,value,next;
            for(int i=0;i<n;i++)
            {
                scanf("%d%d%d",&ad,&value,&next);
                node_temp.value=value;
                node_temp.next=next;
                map1[ad]=node_temp;
            }
            ///分成两组
            sta[abs(map1[address].value)]++;
            v1.push_back(address);
            while(1)
            {
               address=map1[address].next;
               if(address==-1)break;
               if(sta.find(abs(map1[address].value))==sta.end())
               {
                   sta[abs(map1[address].value)]++;
                   v1.push_back(address);
               }
               else
               {
                   v2.push_back(address);
               }
            }
            ///分别输出
            for(__typeof(v1.begin())it=v1.begin();it!=v1.end();it++){
                if(it+1==v1.end())
                    printf("%05d %d -1
    ",*it,map1[*it].value);
                else
                    printf("%05d %d %05d
    ",*it,map1[*it].value,*(it+1));
            }
            for(__typeof(v2.begin())it=v2.begin();it!=v2.end();it++){
                if(it+1==v2.end())
                    printf("%05d %d -1
    ",*it,map1[*it].value);
                else
                    printf("%05d %d %05d
    ",*it,map1[*it].value,*(it+1));
            }
        }
        return 0;
    }
    
    
    
     
  • 相关阅读:
    Delphi xe8 分割字符串太方便了
    Delphi XE8 如何删除Castalia这个渣渣
    Delphi XE7 XE8 开发iphone运用
    美丽图标网站
    xe6输出枚举类型每项字符串
    Delphi XE6记录类型赋值
    XE6 ShortString与String相互转换
    关于Delphi XE6的学习
    Delphi Byte数组与String类型的转换
    Delphi XE6 TStringHelper中的string类型转换
  • 原文地址:https://www.cnblogs.com/kimsimple/p/6567227.html
Copyright © 2011-2022 走看看