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);
    }
}
相关推荐
都叫我大帅哥9 小时前
PPO:那个让你在强化学习路上少摔几跤的“调酒师”
人工智能·算法·强化学习
YGGP9 小时前
【Golang】LeetCode 160. 相交链表
leetcode·链表·golang
橘颂TA9 小时前
【Linux】使用C++对线程进行封装
linux·开发语言·c++
有一个好名字9 小时前
力扣-判断子序列
算法·leetcode·职场和发展
Q741_1479 小时前
C++ 栈 模拟 力扣 946. 验证栈序列 每日一题 题解
c++·算法·leetcode·模拟·
微凉的衣柜9 小时前
【3D 打印避坑实录】如何用 Blender 彻底修复空壳 STL
c++·3d·blender
敲代码敲到头发茂密9 小时前
C++之运算符&循环
开发语言·c++
胖咕噜的稞达鸭10 小时前
算法日记:模拟(提莫攻击,替换所有的问号,Z字形变换,外观数列,数青蛙)
算法
YGGP10 小时前
【Golang】LeetCode 234. 回文链表
leetcode·链表·golang
高洁0110 小时前
【无标题】
人工智能·深度学习·算法·机器学习·transformer