天梯赛 L2-002 链表去重

题目链接:PTA | 程序设计类实验辅助教学平台

思路:用静态链表存储,从头到尾遍历一遍链表。

当遇到不重复的元素时,将这个结点插入l1;

当遇到重复元素时,将这个结点插入l2,并且l1中最后一个结点的next值应被修改为当前结点的next值(因为这个结点被删了),l2最后一个结点的next值为当前结点的address。

注意点:

1.要判断l2是否为空

2.printf格式化输出

参考:c++ printf控制位数_printf()函数的这个用法,我猜你一定不知道_weixin_39985365的博客-CSDN博客

代码:

#include<iostream>
#include<set>
#include<map>
#include<vector>
using namespace std;

const int N = 100005;
typedef pair<int,int>PII;
struct Node{
    int a,b,c;
};

set<int>S;
PII nod[N];
vector<Node>l1,l2;
int pos,n;
int a,b,c;

int main()
{
    cin>>pos>>n;
    
    for(int i=1;i<=n;++i)
    {
        cin>>a>>b>>c;
        nod[a]={b,c};
    }
    
    while(pos!=-1)
    {
        a=pos;
        b=nod[pos].first;
        c=nod[pos].second;
        if(!S.count(abs(b)))
        {
            //如果这个结点没重复,那么在表1插入这个结点
            l1.push_back({a,b,c});
        }
        else
        {
            //如果这个结点重复了,那么在表2插入这个结点
            //修个表1最后一个结点的next结点,为当前结点的next
            //修改表2最后一个结点的next结点,为当前结点的address
            if(!l2.empty()) (l2.end()-1)->c=a; //注意表2为空表
            l2.push_back({a,b,c});
            (l1.end()-1)->c=c;
        }
        S.insert((abs(b)));
        pos=c;
    }
    
    for(auto x : l1)
    {
        if(x.c==-1) printf("%05d %d -1\n",x.a,x.b);
        else printf("%05d %d %05d\n",x.a,x.b,x.c);
    }
    
    if(!l2.empty()) (l2.end()-1)->c=-1; //注意表2为空表
    for(auto x : l2)
    {
        if(x.c==-1) printf("%05d %d -1\n",x.a,x.b);
        else printf("%05d %d %05d\n",x.a,x.b,x.c);
    }
    
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值