【天梯赛】L2-002 链表去重
解题反思
//本题不能在接收输入的时候就处理,因为没有输入完全的时候信息不全面,
//混乱时,先文字写出大致的思路,然后将这思路一条条实现
//printf("%05d\n", cur_node.nxt_address);
//段错误一般是数组访问越界导致,比如Del为空时,Del[0]是非法访问
题面
L2-002 链表去重 - 团体程序设计天梯赛-练习集
代码实现
#include<bits/stdc++.h>
using namespace std;
struct Node{
int value;
int nxt_address;
};
int main()
{
int st_address; cin>>st_address;
int n; cin>>n;
Node t_node;
unordered_map<int, Node>mp;
int cur_address;
for(int i=0; i<n; i++)
{
cin>>cur_address;
cin>>t_node.value>>t_node.nxt_address;
mp[cur_address] = t_node;
}
vector<Node>Exit;
vector<Node>Del;//值&自己的坐标
set<int>st;
//首元素
cur_address = st_address;
Node cur_node;//cur_node记载了值和自己的地址
while(cur_address != -1)//还没到链表的尾巴
{
//遍历到这个点
//判断是否删除这个点
t_node = mp[cur_address];
cur_node.value = t_node.value;
cur_node.nxt_address = cur_address;
//加入对应vector
if(st.count(abs(t_node.value)))//del
{
Del.push_back(cur_node);
}
else{
st.insert(abs(t_node.value));
Exit.push_back(cur_node);
}
//下一个点
cur_address = t_node.nxt_address;
}
//输出
//注意输出补零
if(Exit.size()>0) cur_node = Exit[0];
for(int i=0; i<Exit.size(); i++)
{
printf("%05d ", cur_node.nxt_address);
cout<<cur_node.value<<" ";
if(i == Exit.size()-1) cout<<"-1"<<endl;
else
{
cur_node = Exit[i+1];
printf("%05d\n", cur_node.nxt_address);
}
}
if(Del.size()>0) cur_node = Del[0];
for(int i=0; i<Del.size(); i++)
{
printf("%05d ", cur_node.nxt_address);
cout<<cur_node.value<<" ";
if(i == Del.size()-1) cout<<"-1"<<endl;
else
{
cur_node = Del[i+1];
printf("%05d\n", cur_node.nxt_address);
}
}
return 0;
}