题目:
给定一个单链表 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
这道题有一点坑啊!存在多余结点
所以需要记录链表有效长度
话不多说,代码如下:
#include<stdio.h>
struct node{
int data;
int nextAdd;
}p[100005];
struct ListNode{
int data;
int ADD;
};
typedef struct ListNode Lnode;
int N;
int main(){
int start,i,This_Add,num,Next_Add;
scanf("%d%d",&start,&N);
Lnode List[N+1];
for(i=1;i<=N;i++){
scanf("%d%d%d",&This_Add,&num,&Next_Add);
p[This_Add].data=num;
p[This_Add].nextAdd=Next_Add;
}
int j=1,currentAdd=start,n;//n表示待排序链表真正节点个数(存在多余节点)
while(currentAdd!=-1){
List[j].ADD=currentAdd;
List[j].data=p[currentAdd].data;
currentAdd=p[currentAdd].nextAdd;
j++;
}
n=j-1;
for(j=1;j<(n+1)/2;j++){
printf("%05d %d %05d\n",List[n+1-j].ADD,List[n+1-j].data,List[j].ADD);
printf("%05d %d %05d\n",List[j].ADD,List[j].data,List[n-j].ADD);
}
if(n%2==0)
printf("%05d %d %05d\n",List[n+1-j].ADD,List[n+1-j].data,List[j].ADD);
printf("%05d %d -1\n",List[j].ADD,List[j].data);
return 0;
}