您的位置:首页 > 其它

L2-022. 重排链表

2018-03-26 16:59 337 查看

L2-022. 重排链表

时间限制 500 ms
内存限制 65536 kB
代码长度限制 8000 B
判题程序 Standard 作者 陈越
给定一个单链表 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


///以当前结点地址的值作为下标的结构体数组,来记录当前结点的值和下一结点的地址,
///这样很方便遍历原链表,遍历时就可将链表前一部分存入一个数组中,后一部分存入
///另一个数组中。最后将他们穿插着输出即可。
///注意一种情况:输入的链表信息中可能会有不属于这条链表的结点,此时不对这种结
///点进行处理。
#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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: