题意
给出 L 的第一个结点的地址和一个正整数 N(≤105,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 −1 来表示。
让你输出去重后的链表
思路
1.先用结构体+数组存入所有的节点
2.开一个map去重
3.从头结点开始,一个一个的往后找节点
4.遇到重复节点,就把那个节点存入数组2,不重复的就加入数组1
5.注意处理地址之间的关系即可
坑点
无
代码
#include <bits/stdc++.h>
using namespace std;
struct name{
string idx;//当前节点的地址
int e;//值
string ne;//下一个点的地址
};
map<string, name> ma;//对应
map<int, int> se;//去重
int main()
{
string h; cin >> h;//头节点
int n; cin >> n;//一共有几个节点
for (int i = 1; i <= n; i ++ )
{
string a, c;
int b;
cin >> a >> b >> c;
ma[a] = {a, b, c};
}
vector<name> ans;//链表1
vector<name> ans1;//链表2
for (int i = 1; i <= n; i ++ )
{
auto s = ma[h];
if (se[abs(s.e)] == 0)//没有出现过
{
se[abs(s.e)] = 1;
if (ans.size() != 0) //处理上一个点的ne
{
ans[ans.size() - 1].ne = s.idx;
}
ans.push_back(s);
}
else
{
if (ans1.size() != 0)//处理上一个点的ne
{
ans1[ans1.size() - 1].ne = s.idx;
}
ans1.push_back(s);
}
if (s.ne == "-1") break;
h = s.ne;//赋值为下一个点
}
ans[ans.size() - 1].ne = "-1";//扫尾判断
if (ans1.size() != 0)
{
ans1[ans1.size() - 1].ne = "-1";
}
for (auto i : ans)
{
cout << i.idx << " " << i.e << " " << i.ne << endl;
}
for (auto i : ans1)
{
cout << i.idx << " " << i.e << " " << i.ne << endl;
}
return 0;
}
总结
需熟练掌握链表