首页 > 其他 > 详细

重排链表

时间:2020-02-24 00:57:54      阅读:39      评论:0      收藏:0      [点我收藏+]

标签:fonts   psu   个数   class   相同   html   

给定一个单链表 L?1??→L?2??→?→L?n-1??→L?n??,请编写程序将链表重新排列为 L?n??→L?1??→L?n1??→L?2??→?。例如:给定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\n",b[i],e[b[i]].key,b[i + 1]);
        else
            printf("%05d %d -1\n",b[i],e[b[i]].key);
    }
    return 0;
}
View Code

 

重排链表

标签:fonts   psu   个数   class   相同   html   

原文:https://www.cnblogs.com/xcfxcf/p/12355222.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 bubuko.com 版权所有 鲁ICP备09046678号-4
打开技术之扣,分享程序人生!
             

鲁公网安备 37021202000002号