L2-022 重排链表
题目描述
输入样例:
00100 6
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
输出样例:
68237 6 00100
00100 1 99999
99999 5 12309
12309 2 00000
00000 4 33218
33218 3 -1
思路
用一个结构体存储节点信息。节点数量1e5,用map存节点下标使得访问下标O(1),注意输出格式要求。
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 101010;
struct Node
{
int val;
int ars;
int ne;
}node[N], sunxu[N];
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int begin,n; cin >> begin >> n;
map<int,int>mp;
for(int i=0; i<n; i++)
{
cin >> node[i].ars >> node[i].val >> node[i].ne;
mp[node[i].ars] = i;
}
int k = begin, cnt = 0;
for(int i=0; i<n; i++)
{
cnt ++;
k = mp[k]; //转换为下标
sunxu[i] = node[k];
k = node[k].ne; //转换为下一个地址
if(k==-1) break;
}
int l=0, r=cnt-1;
printf("%05d %d ",sunxu[r].ars,sunxu[r].val);
printf("%05d\n%05d %d ",sunxu[l].ars,sunxu[l].ars,sunxu[l].val);
l++, r--;
while(l<=r){
if(l<r){
printf("%05d\n%05d %d ",sunxu[r].ars,sunxu[r].ars,sunxu[r].val);
printf("%05d\n%05d %d ",sunxu[l].ars,sunxu[l].ars,sunxu[l].val);
}
else{//剩下最后一个节点
printf("%05d\n%05d %d ",sunxu[r].ars,sunxu[r].ars,sunxu[r].val);
}
r--, l++;
}
printf("-1");
}