给定一个单链表 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题意是给一个乱序链表的位置,然后给其存的数据和其next链表的位置。先把这个链表按1~N正确排到一个数组里面,然后根据题目要求的输出方式即可,
有个坑在于给的链表不一定全部在一个链上,然后需要看排完后这个链表有几个数据就输出几个,
#include<iostream>
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
#include <map>
#include <set>
#include <math.h>
#include <queue>
#include <algorithm>
using namespace std;
int p[1050][1050];
int min1[1050][1050];
struct ttt{
int data,next;
int i;
};
ttt q1[1050000];
ttt q2[1050000];
int main(){
// freopen("in.txt","r",stdin);
int i,j,k,l1,f1,f2,f3,f4,t4,t1,t2,t3,n,m;
cin >> t1 >> n;
for(i=1;i<=n;i++){
cin >> f1 >>f2>>f3;
q1[f1].data=f2;
q1[f1].next=f3;
}
i=1;
while(1){
q2[i].data=q1[t1].data;
q2[i].next=q1[t1].next;
q2[i].i=t1;
i++;
t1=q1[t1].next;
if(t1==-1)break;
}
n=i-1;
k=n;
f1=0;
while(f1<n){
if(n-f1==1){
printf("%05d %d -1\n",q2[k].i,q2[k].data);
break;
}else if(n-f1==2){
printf("%05d %d %05d\n",q2[k].i,q2[k].data,q2[n+1-k].i);
printf("%05d %d -1\n",q2[n+1-k].i,q2[n+1-k].data);
break;
}else{
printf("%05d %d %05d\n",q2[k].i,q2[k].data,q2[n+1-k].i);
printf("%05d %d %05d\n",q2[n+1-k].i,q2[n+1-k].data,q2[k-1].i);
f1+=2;
}
k--;
}
//k=0;
//printf("%02d\n",k);
return 0;
}