思路
用地址做下标 查的时候直接用下标 再用一个vector存顺序弄好的链表 再搞一个node数组放ans
开了两个数组 一个vector
vector放中间结果 过度作用
mid和ans记住的都是id
mid是正常顺序的 ans是乱序的
期间一直有个点不对 经过无数次的尝试之后 。。。
md!!! 测试点3竟然是 第1个结点的地址在数据中没有!!!没有!!!dog…very dog
00100 1
00000 4 -1
1.常规法
#include <iostream>
#include <vector>
using namespace std;
struct node
{
int data, next;
};
int main()
{
int id, n;
cin >> id >> n;
node a1[100005];
int ans[100005];
vector<int> mid;
for (int i = 0; i < n; i++)
{
//通过下标找
//不用记住id了
int x;
cin >> x;
cin >> a1[x].data >> a1[x].next;
}
// cout << endl;
//排序
while (id != -1)
{
mid.push_back(id);
id = a1[id].next;
}
//3 测试点
n = mid.size();
//ans出动
int a = 0, b = n - 1;
int I = 0;
//按题目的要求的顺序
while (a <= b)
{
if (a == b)
//奇数的情况
ans[I++] = mid[b--];
else
{
ans[I++] = mid[b--];
ans[I++] = mid[a++];
}
}
for (int i = 0; i < (I - 1); i++)
{
printf("%05d %d %05d\n", ans[i], a1[ans[i]].data, ans[i + 1]);
}
//最后的单独处理
printf("%05d %d -1\n", ans[I - 1], a1[ans[I - 1]].data);
return 0;
}
2.map
#include <iostream>
#include <map>
#include <iomanip>
#include <vector>
#include <utility>
using namespace std;
int main()
{
int a, n;
cin >> a >> n;
//id当索引 data和next当内容
//把pair当成一个数组
map<int, pair<int, int>> mp;
while (n--)
{
int s, x, e;
cin >> s >> x >> e;
mp[s] = make_pair(x, e);
}
vector<pair<int, int>> v;
//先把正确的顺序搞对
//往v里加的 id和data
//next作为下一个的索引
for (int adr = a; adr != -1; adr = mp[adr].second)
{
v.push_back(make_pair(mp[adr].first, adr));
}
//根据题目的排序
int s = 0, r = v.size() - 1;
while (s < r)
{
//第一次不输出
if (r != v.size() - 1) //2.这个是下一个的id (这个要放到最前面 因为最后要输出-1)
cout << setw(5) << setfill('0') << v[r].second << "\n";
//1.当前的id
cout << setw(5) << setfill('0') << v[r].second << ' ';
//1.当前的data
cout << v[r--].first << " ";
//1.下一个的id
cout << setw(5) << setfill('0') << v[s].second << "\n";
//2.当前的id
cout << setw(5) << setfill('0') << v[s].second << " ";
//2.当前的data
cout << v[s++].first << ' ';
}
//有可能是奇数
if (s == r)
{
cout << setw(5) << setfill('0') << v[s].second << "\n";
cout << setw(5) << setfill('0') << v[s].second << " ";
cout << v[s].first << ' ';
}
cout << "-1\n";
return 0;
}