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);
    }
}
相关推荐
爱编程— 的小李1 分钟前
有序序列合并(c语言)
c语言·算法
云卓SKYDROID3 分钟前
无人机反步滑膜控制算法!
算法·无人机·知识科普·云卓科技·反步滑膜控制算法
云卓科技3 分钟前
无人机之自动控制原理篇
科技·算法·目标检测·机器人·无人机
云卓科技5 分钟前
无人机之集群控制方法篇
科技·算法·无人机·交互·制造
混迹网络的权某6 分钟前
每天一道C语言精选编程题之求数字的每⼀位之和
c语言·开发语言·考研·算法·改行学it·1024程序员节
高雪峰9137 分钟前
C语言日记 2024年10月30日
数据结构·力扣
Curry_Math9 分钟前
LeetCode 热题 100之链表3
算法·leetcode·链表
hn小菜鸡3 小时前
LeetCode 2058.找出临界点之间的最小和最大距离
算法·leetcode·职场和发展
liuyang-neu3 小时前
力扣 简单 70.爬楼梯
java·算法·leetcode
IronmanJay3 小时前
【LeetCode每日一题】——862.和至少为 K 的最短子数组
数据结构·算法·leetcode·前缀和·双端队列·1024程序员节·和至少为 k 的最短子数组