1025 反转链表

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

    我觉得这道题的思路还是很清晰的,就不再赘述了,具体的可以看代码注释,写的比较详细。但是就是有两个测试点通不过,不晓得问题出在哪了,

另外注意一点,就是由于末尾元素是没有后继的,它以-1结束,但是在输入的时候,可能在输入了末尾元素后还继续输入元素,这个时候就要先把他们

过滤掉,然后再串起来,下面的测试用例就是针对的这种情况,测试用例如下:

00001 5 3
00001 1 00002
00002 2 00003
00003 3 00004
00004 4 -1
99999 5 12345

    附上代码

 1 #include<cstdio>
 2 #include<map>
 3 #include<vector>
 4 using namespace std;
 5 struct Node{
 6     int address,data,next;
 7 };
 8 int main() 
 9 {
10     int first,N,K,tem;
11     Node node;
12     map<int,Node> mp;
13     vector<Node> v;
14     scanf("%d %d %d",&first,&N,&K);
15     while(N--){    //输入每个结点,让每个结点的地址做关键字,数字和后继做key的值
16         scanf("%d %d %d",&node.address,&node.data,&node.next);
17         mp[node.address]=node;
18     }
19     tem=first;
20     do{    //把输入的数据串成单链表
21         v.push_back(mp[tem]);
22         tem=mp[tem].next;    
23     }while(tem!=-1);     //遇到 -1就是最后一个元素,结束,防止输入无效结点
24     int len=v.size(),begin,end,i;
25     for(begin=0,end=K-1;len>=K&&end<v.size();len-=K){    //K小于等于当前链表长度,可以反转
26         for(i=end;i>=begin;i--){   //反转输出
27             if(i==begin&&v[end].next!=-1){   //begin结点的前驱为end结点,end不是链表中的末尾元素
28                 printf("%05d %d %05d
",v[i].address,v[i].data,v[end].next);
29                 break;
30             }
31             if(i==begin&&v[end].next==-1){   //begin结点的前驱为end结点,并且end是链表中的末尾元素
32                 printf("%05d %d %d
",v[i].address,v[i].data,v[end].next);
33                 break;
34             }
35             printf("%05d %d %05d
",v[i].address,v[i].data,v[i-1].address);
36         }
37         begin=end+1;  //下一次的反转区间
38         end+=K;
39     }
40     if(K>len&&len!=0){   //K大于当前所剩下的链表长度,不能反转,直接输出
41         for(i=begin;i<v.size()-1;i++)
42             printf("%05d %d %05d
",v[i].address,v[i].data,v[i].next);
43         printf("%05d %d %d
",v[i].address,v[i].data,v[i].next);
44     }
45     return 0;
46 }

    有两个测试点错误,结果如下

     如果有大佬看出哪里有错误,欢迎指出!谢谢!

原文地址:https://www.cnblogs.com/buanxu/p/12813370.html