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);
    }
}
相关推荐
码小猿的CPP工坊40 分钟前
C++软件开发之内存泄漏闭坑方法
开发语言·c++
Ethan-D43 分钟前
#每日一题19 回溯 + 全排列思想
java·开发语言·python·算法·leetcode
Benny_Tang43 分钟前
题解:CF2164C Dungeon
c++·算法
仙俊红1 小时前
LeetCode174双周赛T3
数据结构·算法
橘颂TA1 小时前
【剑斩OFFER】算法的暴力美学——LeetCode 733 题:图像渲染
算法·leetcode·职场和发展
不穿格子的程序员1 小时前
从零开始写算法——回溯篇2:电话号码的字母组合 + 组合总和
算法·深度优先·回溯
仍然.1 小时前
JavaDataStructure---二叉搜索树,哈希表,Map和Set
数据结构·散列表
青小莫2 小时前
C语言vsC++中的动态内存管理(内含底层实现讲解!)
java·c语言·c++
持梦远方2 小时前
算法剖析1:摩尔投票算法 ——寻找出现次数超过一半的数
c++·算法·摩尔投票算法
AI视觉网奇2 小时前
ue5 自定义 actor ac++ actor 用法实战
java·c++·ue5