感觉这是30道真题里最难的一道了,比其他25分的题主要难在它的陷阱太多,题目并没有明确指出,用了好久才AC,看到所有测试点都不红了,激动。
经过多次尝试,总结的陷阱主要有 :
1.看清题意!!!看清链表如何反转!!!
2.首地址为-1的情况分类出来
3.输出最后一个节点是next必须为-1.
4.输入的节点中的无效节点不计入链表长度(节点地址无法与给定的首地址遍历下来的链表节点的next衔接上的为废节点)
5.K为边界值时的情况要注意(比如K>N,K=N,K=1,K=0)
/*********代码如下*********************************/
#include<stdio.h>
#include<string>
struct node
{
int a,next;
int data;
};
int main()
{
int N=0,K,C, A;
int i,j=0,k=0;
node temp;
node L[100001],S[100001];
scanf("%d %d %d",&A,&C,&K);
if(A==-1)
printf("-1\n");
else{
for(i=0;i<C;i++)
{
scanf("%d %d %d",&temp.a,&temp.data,&temp.next);
if(temp.a!=-1)
{S[N]=temp;N++;}
}
temp.next=A;
C=0;
while(C<N)
{
if(temp.next==-1)
break;
for(i=0;i<N;i++)
if(S[i].a==temp.next)
{
temp=S[i];
L[j]=S[i];
j++;
}
C++;
}
N=j;
i=0;
C=i+K;
while(C<=N&&K>1)
{
k=1;
j=i;
for(;i<(C+j)/2;i++)
{
temp=L[C-k];
L[C-k]=L[i];
L[i]=temp;
k++;
}
i=K+j;
C=i+K;
}
for(i=0;i<N-1;i++)
printf("%05d %d %05d\n",L[i].a,L[i].data,L[i+1].a);
if(N-1>=0)
printf("%05d %d -1\n",L[N-1].a,L[N-1].data);
}
return 0;
}