1025 反转链表
Posted buanxu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1025 反转链表相关的知识,希望对你有一定的参考价值。
给定一个常数 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 (≤10?5??)、以及正整数 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 }
有两个测试点错误,结果如下
如果有大佬看出哪里有错误,欢迎指出!谢谢!
以上是关于1025 反转链表的主要内容,如果未能解决你的问题,请参考以下文章