• L2-002 链表去重 (25 分) (模拟)


    链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805072641245184


    题目:

    给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。

    输入格式:

    输入在第一行给出 L 的第一个结点的地址和一个正整数 N(≤,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 − 来表示。

    随后 N 行,每行按以下格式描述一个结点:

    地址 键值 下一个结点
    

    其中地址是该结点的地址,键值是绝对值不超过1的整数,下一个结点是下个结点的地址。

    输出格式:

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

    输入样例:

    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


    题意:
    如题

    思路:
    用结构体模拟 每个结点的地址为结构体的下标 价值为w 下一个结点为nx 按照题意模拟


    代码:
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <string>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const int inf=0x3f3f3f3f;
    const int maxn=1e5+10;
    int st,n,x;
    int vis[maxn],ans1[maxn],ans2[maxn];
    
    struct node{
        int w,nx;
    }kk[maxn];
    
    int main(){
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&st,&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&x);
            scanf("%d%d",&kk[x].w,&kk[x].nx);
        }
        int cnt1=0,cnt2=0;
        for(int i=st;i!=-1;i=kk[i].nx){
            int tmp=abs(kk[i].w);
            if(vis[tmp]==0){
                vis[tmp]=1;
                ans1[++cnt1]=i;
            }
            else ans2[++cnt2]=i;
        }
        for(int i=1;i<=cnt1;i++){
            if(i==cnt1) printf("%05d %d -1
    ",ans1[i],kk[ans1[i]].w);
            else printf("%05d %d %05d
    ",ans1[i],kk[ans1[i]].w,ans1[i+1]);
        }
        
        for(int i=1;i<=cnt2;i++){
            if(i==cnt2) printf("%05d %d -1
    ",ans2[i],kk[ans2[i]].w);
            else printf("%05d %d %05d
    ",ans2[i],kk[ans2[i]].w,ans2[i+1]);
        }
        return 0;
    }
  • 相关阅读:
    AS3包类大全新手必学
    31天重构学习笔记27. 去除上帝类
    31天重构学习笔记26. 避免双重否定
    31天重构学习笔记29. 去除中间人对象
    与继承相关的一些重构(二)
    31天重构学习笔记28. 为布尔方法命名
    与继承相关的一些重构(一)
    31天重构学习笔记25. 引入契约式设计
    必会重构技巧(一):封装集合
    31天重构学习笔记30. 尽快返回
  • 原文地址:https://www.cnblogs.com/whdsunny/p/10609757.html
Copyright © 2020-2023  润新知