重排链表

给定一个单链表 L1​​→L2​​→⋯→Ln-1​​→Ln​​,请编写程序将链表重新排列为 Ln​​→L1​​→Ln1​​→L2​​→⋯。例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3。

输入格式:

每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址和结点总个数,即正整数N (≤)。结点的地址是5位非负整数,NULL地址用−表示。

接下来有N行,每行格式为:

Address Data Next

其中Address是结点地址;Data是该结点保存的数据,为不超过1的正整数;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 <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
struct node{
    int key,next;
}e[maxn];
int a[maxn],b[maxn];
int n,t,start;
int main(){
    //freopen("in","r",stdin);
    cin >> start >> n;
    for(int i = 0; i < n; i++){
        cin >> t;
        cin >> e[t].key >> e[t].next;
    }
    int c = 0;
    a[c++] = start;
    start = e[start].next;
    while(start != -1){
        a[c++] = start;
        start = e[start].next;
    }
    //范围一点更要该成c;要不然有一个测试点不过 输出多余节点
    int l = 0,r = c - 1;
    c = 0;
    while(l <= r){
        b[c++] = a[r--];
        if(l <= r)
            b[c++] = a[l++];
    }
    
    for(int i = 0; i < c; i++){
        if(i != c - 1)
            printf("%05d %d %05d
",b[i],e[b[i]].key,b[i + 1]);
        else
            printf("%05d %d -1
",b[i],e[b[i]].key);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/xcfxcf/p/12355222.html