L2-022. 重排链表
Standard
给定一个单链表 L
1
→L
2
→…→L
n-1
→L
n
,请编写程序将链表重新排列为 L
n
→L
1
→L
n-1
→L
2
→…。例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3。
输入格式:
每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址和结点总个数,即正整数N (<= 10
5
)。结点的地址是5位非负整数,NULL地址用-1表示。
接下来有N行,每行格式为:
Address Data Next
其中
Address
是结点地址;
Data
是该结点保存的数据,为不超过10
5
的正整数;
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
///以当前结点地址的值作为下标的结构体数组,来记录当前结点的值和下一结点的地址,
///这样很方便遍历原链表,遍历时就可将链表前一部分存入一个数组中,后一部分存入
///另一个数组中。最后将他们穿插着输出即可。
///注意一种情况:输入的链表信息中可能会有不属于这条链表的结点,此时不对这种结
///点进行处理。
#include<stdio.h>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
struct yun
{
int num;
int next=-1;
}point[101000];
vector<int> v1;
vector<int> v2;
vector<int> v3;
int main()
{
int dress,first,n,i;
scanf("%d%d",&first,&n);
for(i=0;i<n;i++)
{
scanf("%d",&dress);
scanf("%d%d",&point[dress].num,&point[dress].next);
}
int l=0,k=0;
for(i=first;i!=-1;i=point[i].next)
l++;
int h=(l+1)/2;
for(i=first;i!=-1;i=point[i].next)
{
k++;
if(k>h)
v2.push_back(i);
else v1.push_back(i);
}
for(i=0;i<v1.size();i++)
{
if(l-h-1-i>=0)v3.push_back(v2[l-h-1-i]);
v3.push_back(v1[i]);
}
int len=v3.size();
for(i=0;i<len-1;i++)
printf("%05d %d %05d\n",v3[i],point[v3[i]].num,v3[i+1]);
printf("%05d %d -1\n",v3[len-1],point[v3[len-1]].num);
}