L2-022 重排链表

超详解析,手打不易,转载注明出处,点赞收藏,多谢支持

L2-022 重排链表

倒数第二测试点:给出的结点可能不在一条链表上!

#include<stdio.h>
#include<stdlib.h>
struct LNode{
    long data;   //数据
    long Next;  //下一个地址
}LNodes[100010];

int main(){
    long head_address,N;    //头地址、链表长度
    scanf("%ld %ld",&head_address,&N);
    for(int i=0;i<N;i++){   //赋值
        long address;
        scanf("%ld",&address);
        scanf("%ld %ld",&LNodes[address].data,&LNodes[address].Next);
    }
    long Seq[N];    //辅助数组
    long p = head_address;
    //地址排序 从头到尾 ***
    int num = 0;            //小心!给出的链表结点可能不是同一条链表,所以重新计数!!
    while(p != -1){         //第一条链表到-1截止
        Seq[num++] = p;
        p = LNodes[p].Next;
    }
    int next=0,pre=num-1,tmp = 0;
    //输出
    while(num--){   //建议手写算一遍,好明白三目运算那里的思路
        printf("%05ld %ld ",Seq[pre],LNodes[Seq[pre]].data);
        tmp = tmp < pre ? --pre : ++pre;    //5 0 4 2 3 1
        if(num == 0){   //以输出完,最后项 -1 
            printf("-1\n");
            break;
        }
        printf("%05ld\n",Seq[next]);
        pre = next;
        next = tmp;
    }
}

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