给定一个单链表 L1→L2→⋯→Ln−1→Ln,请编写程序将链表重新排列为 Ln→L1→Ln−1→L2→⋯。例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3。
输入格式:
每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址和结点总个数,即正整数N (≤105)。结点的地址是5位非负整数,NULL地址用−1表示。
接下来有N行,每行格式为:
Address Data Next
其中
Address
是结点地址;Data
是该结点保存的数据,为不超过105的正整数;Next
是下一结点的地址。题目保证给出的链表上至少有两个结点。输出格式:
对每个测试用例,顺序输出重排后的结果链表,其上每个结点占一行,格式与输入相同。
输入样例:
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
代码长度限制
16 KB
时间限制
500 ms
内存限制
64 MB
思路:就是用单链表模拟一个链表,这里的话就是大概四个数组,一个存当前地址,一个存当前值,一个存下一个地址,一个存当前地址对应的编号,这样的话就是最后输出的时候会有点小麻烦,不过稍微处理一下就可以了
#include "bits/stdc++.h" using namespace std; const int N = 1e5 + 10; int a[N]; map<string , int> mp; string s[N], nex[N]; vector<int> v; int main(){ string ss, s1; int n; cin>>ss>>n; int x; int start; for(int i = 0; i < n; i++){ cin>>s[i]>>a[i]>>nex[i]; mp[s[i]] = i; if(s[i] == ss) start = i; } int i = start; s1 = s[i]; while( s1 != "-1"){ v.push_back(i); s1 = nex[i]; i = mp[nex[i]]; } int t; if(v.size()/2*2 < v.size()) t = v.size()/2 + 1; else t = v.size()/2; for(int i = 0; i < t; i++){ if(v[v.size() - i - 1] != v[i]) { cout<<s[v[v.size() - i - 1]]<<" "<<a[v[v.size() - i - 1]]<<" "<<s[v[i]]<<endl;} if(i != t - 1) cout<<s[v[i]]<<" "<<a[v[i]]<<" "<<s[v[v.size() - i - 2]]; else cout<<s[v[i]]<<" "<<a[v[i]]<<" -1"; if(i != t - 1) cout<<endl; } return 0; }