zoukankan      html  css  js  c++  java
  • L2-022. 重排链表

    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

    思路分析:

     

    注意可能不是一个链表,即最后的有效结点个数不一定是n,要自己数。这个是链表中常见的陷阱,要多加注意。

    重排序的时候,从num-1到num/2的序号为奇数1 3 5.... 从0到num/2-1的序号为2 4 6....

    #include<iostream>
    #include<cstring>
    #include<string>
    #include<queue>
    #include<algorithm>
    #include<cmath>
    #include<vector>
    #include<map>
    #define inf 0x3f3f3f3f
    using namespace std;
    struct node
    {
        int v;
        int nxt;
    }a[100005];
    
    struct node1
    {
        int v;
        int id;
        int nxt;
        int bh;
    }b[100005];
    map<int,int>mp;
    bool cmp( node1 x,node1 y)
    {
        return x.bh<y.bh;
    }
    int main()
    {
        int p=1;
        int h;
        cin>>h;
        a[h].v=h;
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            int x,v,y;
            cin>>x>>v>>y;
            a[x].v=v;
            a[x].nxt=y;
        }
        b[1].id=h;
        b[1].nxt =a[h].nxt ;
        b[1].v=a[h].v;
        int i;
        for(i=2;i<=n;i++)
        {
            int temp=b[i-1].nxt ;
            b[i].id=temp;
            b[i].nxt =a[temp].nxt ;
            b[i].v=a[temp].v;
            if(b[i].nxt==-1) break;//可能存在无效的
        }
        n=i;
        int k=2;
        /*for(i=1;i<=n;i++)
        {
            cout<<b[i].bh<<" "<<b[i].id<<" "<<b[i].v<<" "<<b[i].nxt <<endl;
        }*/
        for(i=1;i<=n/2;i++)//只要改变编号再排个序就可以了
        {
            b[i].bh=k;
            k+=2;
        }
        if(n%2==0) k=k-2-1;
        else k=k-1;
        for(int i=n/2+1;i<=n;i++)
        {
            b[i].bh=k;
            k-=2;
        }
        /*cout<<endl<<endl;
        for(i=1;i<=n;i++)
        {
            cout<<b[i].bh<<" "<<b[i].id<<" "<<b[i].v<<" "<<b[i].nxt <<endl;
        }*/
        sort(b+1,b+n+1,cmp);
        /*cout<<endl<<endl;*/
        for(int i=2;i<=n;i++)
        {
            printf("%05d %d %05d
    ",b[i-1].id,b[i-1].v,b[i].id);
        }
        printf("%05d %d -1",b[n].id,b[n].v);
    
        
    }
    
    
    
        
  • 相关阅读:
    jquery源码解读 (摘自jQuery源码分析系列图书(pdf)) 持续更新
    jquery源码学习
    判断浏览器是ie9座特殊处理
    js继承
    引入flash
    IE7下面踩得坑
    导航栏对应相应的模块,可点击索引和滚动索引到需要到达的位置
    java的eclipse的使用
    弹窗在大屏上居中对齐,在小屏上被挡住解决方案
    左侧菜单栏,有对个li对应一个content
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/13271076.html
Copyright © 2011-2022 走看看