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);
    }
}
相关推荐
颜酱6 小时前
图的数据结构:从「多叉树」到存储与遍历
javascript·后端·算法
saltymilk10 小时前
使用 C++ 模拟 ShaderLanguage 的 swizzle
c++·模板元编程
zone773911 小时前
006:RAG 入门-面试官问你,RAG 为什么要切块?
后端·算法·面试
CoovallyAIHub14 小时前
OpenClaw 近 2000 个 Skills,为什么没有一个好用的视觉检测工具?
深度学习·算法·计算机视觉
CoovallyAIHub14 小时前
CVPR 2026 | 用一句话告诉 AI 分割什么——MedCLIPSeg 让医学图像分割不再需要海量标注
深度学习·算法·计算机视觉
CoovallyAIHub14 小时前
Claude Code 突然变成了 66 个专家?这个 5.8k Star 的开源项目,让我重新理解了什么叫"会用 AI"
深度学习·算法·计算机视觉
兆子龙14 小时前
前端哨兵模式(Sentinel Pattern):优雅实现无限滚动加载
前端·javascript·算法
xlp666hub17 小时前
Leetcode第五题:用C++解决盛最多水的容器问题
linux·c++·leetcode
CoovallyAIHub18 小时前
9个视觉语言模型工厂实测:Qwen 87.9%碾压全场,你的显卡能跑哪个?
算法
SparkX开源AI知识库18 小时前
手摸手带你安装OpenClaw并对接飞书
算法·架构