超详解析,手打不易,转载注明出处,点赞收藏,多谢支持
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版权协议,转载请附上原文出处链接和本声明。