zoukankan      html  css  js  c++  java
  • 重排链表

    给定一个单链表 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
  • 相关阅读:
    [ASM/C/C++]内存碎片处理技术
    NASM网际编译器手册(三)
    NASM网际编译器手册(四)
    NASM网际编译器手册(六)
    NASM网际编译器手册(一)
    IEEE浮点数表示法
    设计模式学习每日一记(12.轻量模式)
    设计模式学习每日一记(11.代理模式)
    canvas一句话备忘录
    usaco1.1.1PROB Your Ride Is Here
  • 原文地址:https://www.cnblogs.com/xcfxcf/p/12355222.html
Copyright © 2011-2022 走看看