L2-022. 重排链表

  • Post author:
  • Post category:其他


L2-022. 重排链表

时间限制
500 ms

内存限制
65536 kB

代码长度限制
8000 B

判题程序

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);
}



版权声明:本文为mjj1024原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。