1097 Deduplication on a Linked List——PAT甲级

Given a singly linked list L with integer keys, you are supposed to remove the nodes with duplicated absolute values of the keys. That is, for each value K, only the first node of which the value or absolute value of its key equals K will be kept. At the mean time, all the removed nodes must be kept in a separate list. For example, given L being 21→-15→-15→-7→15, you must output 21→-15→-7, and the removed list -15→15.

Input Specification:

Each input file contains one test case. For each case, the first line contains the address of the first node, and a positive N (≤105) which is the total number of nodes. The address of a node is a 5-digit nonnegative integer, and NULL is represented by −1.

Then N lines follow, each describes a node in the format:

Address Key Next

where Address is the position of the node, Key is an integer of which absolute value is no more than 104, and Next is the position of the next node.

Output Specification:

For each case, output the resulting linked list first, then the removed list. Each node occupies a line, and is printed in the same format as in the input.

Sample Input:

00100 5
99999 -7 87654
23854 -15 00000
87654 15 -1
00000 -15 99999
00100 21 23854

Sample Output:

00100 21 23854
23854 -15 99999
99999 -7 -1
00000 -15 87654
87654 15 -1

solution:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int Next[maxn]={0};
int Data[maxn]={0};
int main()
{
    int head,n;
    cin>>head>>n;
    for(int i=0;i<n;i++)
    {
        int t;cin>>t;
        cin>>Data[t]>>Next[t];
    }
    vector<pair<int,int> >l1,ans,del;
    int cnt=0;
    while(head!=-1)
    {
        cnt++;
        l1.push_back({head,Data[head]});
        head=Next[head];
    }
    set<int>s;
    for(int i=0;i<cnt;i++)
    {
        if(s.count(abs(l1[i].second)))
        {
            del.push_back({l1[i].first,l1[i].second});
            continue;
        }
        ans.push_back({l1[i].first,l1[i].second});
        s.insert(abs(l1[i].second));
    }
    for(int i=0;i<ans.size()-1;i++)
    {
        printf("%05d %d %05d\n",ans[i].first,ans[i].second,ans[i+1].first);
    }
    printf("%05d %d -1\n",ans[ans.size()-1].first,ans[ans.size()-1].second);
    if(del.size())
    {
        for(int i=0;i<del.size()-1;i++)
        {
            printf("%05d %d %05d\n",del[i].first,del[i].second,del[i+1].first);
            
        }
        printf("%05d %d -1\n",del[del.size()-1].first,del[del.size()-1].second);
    }
}
相关推荐
烦躁的大鼻嘎8 分钟前
模拟算法实例讲解:从理论到实践的编程之旅
数据结构·c++·算法·leetcode
IU宝11 分钟前
C/C++内存管理
java·c语言·c++
fhvyxyci12 分钟前
【C++之STL】摸清 string 的模拟实现(下)
开发语言·c++·string
C++忠实粉丝25 分钟前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
古月居GYH36 分钟前
在C++上实现反射用法
java·开发语言·c++
Betty’s Sweet38 分钟前
[C++]:IO流
c++·文件·fstream·sstream·iostream
用户37791362947551 小时前
【循环神经网络】只会Python,也能让AI写出周杰伦风格的歌词
人工智能·算法
敲上瘾1 小时前
操作系统的理解
linux·运维·服务器·c++·大模型·操作系统·aigc
福大大架构师每日一题1 小时前
文心一言 VS 讯飞星火 VS chatgpt (396)-- 算法导论25.2 1题
算法·文心一言
不会写代码的ys1 小时前
【类与对象】--对象之舞,类之华章,共绘C++之美
c++