咨询关于PAT乙级1025部分答案错误问题

千里东风一梦遥 2018-01-27 01:48:05
1025. 反转链表 (25)
给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转。例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4;如果K为4,则输出应该为4→3→2→1→5→6,即最后不到K个元素不反转。

输入格式:

每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址、结点总个数正整数N(<= 105)、以及正整数K(<=N),即要求反转的子链结点的个数。结点的地址是5位非负整数,NULL地址用-1表示。

接下来有N行,每行格式为:

Address Data Next

其中Address是结点地址,Data是该结点保存的整数数据,Next是下一结点的地址。

输出格式:

对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。

输入样例:
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
输出样例:
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1

下面是我的代码:


#include<stdio.h>
using namespace std;
struct Node{
int ad;
int data;
int next;
}node[100001],temp[100001];
int main()
{
int fstad,n,k;
while(scanf("%d %d %d",&fstad,&n,&k)!=EOF){ //输入起始地址,节点数与交换长度
for(int i=0;i<n;i++){
scanf("%d %d %d",&node[i].ad,&node[i].data,&node[i].next); //输入节点的地址,节点数值与指向下一节点的地址
}
int j=0; //统计有效节点数
for(int i=0;i<n;i++){ //依次找出每个节点并放在temp[]数组中
if(fstad==node[i].ad){
temp[j++]=node[i];
fstad=node[i].next;
i=-1;
}
if(fstad==-1) break;
}
int cont=0;
int t=0;
for(int i=k-1;i>=0&&cont<j/k;i--){ //对每隔K区间的节点转置后放入到node[]中
node[t++]=temp[i];
if(i==cont*k){
cont++;
i=cont*k+k;
}
}
if(j%k!=0){ //后面不够K的部分直接存入对应的node[]中
for(int i=j-j%k;i<n;i++){
node[i]=temp[i];
}
}
for(int i=0;i<j-1;i++){ //将后一节点的node[i].ad放入到前一节点的next中
node[i].next=node[i+1].ad;
}
for(int i=0;i<j;i++){ //依次打印
if(node[i].next==-1) printf("%05d %d %d\n",node[i].ad,node[i].data,node[i].next);
else printf("%05d %d %05d\n",node[i].ad,node[i].data,node[i].next);
}
}
return 0;
}


我测试了多个例子,都可以通过没有问题,可是OJ判断是答案错误与超时,求助各位帮忙看看,谢谢。
...全文
496 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
create-two 2020-04-08
  • 打赏
  • 举报
回复
我也是这个错误,楼主找到问题了吗?
  • 打赏
  • 举报
回复
@自信男孩 题目给的是输出4→3→2→1→5→6,也就是最后不满足K大小的不进行转置
自信男孩 2018-01-27
  • 打赏
  • 举报
回复
"如果K为4,则输出应该为4→3→2→1→5→6" 这句,若K为4,那么输出应该是:4→3→2→1→6→5吧
  • 打赏
  • 举报
回复
@自信男孩 能否帮忙看看,谢谢

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧