题目描述

给定一个常数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是下一结点的地址。

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

输入
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

别人的思路

之前一直想着用最小的空间解决问题,但一直超时,思维也一直被局限在这里,后来看了别人的答案才恍然大悟——原来自己钻牛角尖了。。。思路是:利用足够大的数组作为一个静态链表,结点的地址是数组下标,这样对链表的操作就很简单了,也不用排序;每k个结点翻转时,将这k个元素组成的链表拆下来,链表中剩余的部分组成一个链表,然后将这k个元素以头插法插入到该链表中,为了操作方便,将链表设为带头结点的链表。要注意的是对每k个结点翻转的循环次数的控制,这里也是个坑,因为输入时有的结点是无效的,并不在链表中,所以链表的元素个数要自行统计。

别人的代码

#include <stdio.h>
#include <memory.h>#define LIMIT 100002struct linknode {int data;int next;
};int reversek(struct linknode *, int, int);int main(void) {struct linknode list[LIMIT];int faddr, n, k;int addr, data, next;int i, j, count = 0;scanf("%d %d %d", &faddr, &n, &k);memset(list, 0, LIMIT * sizeof(struct linknode));list[LIMIT-1].next = faddr;  //head nodefor(i = 0; i < n; ++i) {scanf("%d %d %d", &addr, &data, &next);list[addr].data = data;list[addr].next = next;}for(i = list[LIMIT-1].next; i != -1; i = list[i].next)++count; //count valid nodesfor(j = count / k, i = LIMIT - 1; j > 0 && i != -1; --j)i = reversek(list, i, k); //reverse every k nodesfor(i = list[LIMIT-1].next; list[i].next != -1; i = list[i].next)printf("%05d %d %05d\n", i, list[i].data, list[i].next);printf("%05d %d %d\n", i, list[i].data, list[i].next);return 0;
}int reversek(struct linknode *list, int head, int k) {int i, j, p;int nexthead;for(j = 0, p = list[head].next; j < k && p != -1; ++j) //find tailp = list[p].next;nexthead = list[head].next;list[head].next = p;for(j = 0, i = nexthead; j < k && i != -1; ++j) {p = list[i].next;list[i].next = list[head].next; //insert at the headlist[head].next = i;i = p;}return nexthead;
}

我的代码(问题出在:双向链表的pre和next在翻转后会混在一起,无法遍历打印,而且翻转的过程有错误,没改完)

除非“假翻转”,用大哥走4步,小弟回溯打印3步的思想(能够回溯,这也是用双向链表存储的原因)

#include<iostream>
#include<string>
#include<vector>
class DoubleNode
{public:int address;int data;int pre;int next;void putIn(int address, int data, int pre, int next);//构造器
};
void DoubleNode::putIn(int address, int data, int pre, int next)
{this->address = address;this->data = data;this->pre = pre;this->next = next;
}
void reverse(DoubleNode* nodeInOrder, int dage, int reverseNum)//找到第一个和最后一个,改变指针指向,不需要改变元素的值
{int first = dage;int last = dage + reverseNum - 1;if (first == 0)//如果是头{nodeInOrder[last].next = -1;//last的next指向-1nodeInOrder[nodeInOrder[last].next].pre = nodeInOrder[first].address;//last后面的元素的pre指向firstnodeInOrder[first].next = nodeInOrder[nodeInOrder[last].next].address;//first的next指向last后面的元素}else if (nodeInOrder[last].next == -1)//如果是尾{nodeInOrder[nodeInOrder[first].pre].next = nodeInOrder[last].address;//first前面的元素的next指向lastnodeInOrder[last].pre = nodeInOrder[nodeInOrder[first].pre].address;//last的pre指向first前面的元素nodeInOrder[first].next = -1;//first的next指向-1}else{nodeInOrder[nodeInOrder[first].pre].next = nodeInOrder[last].address;//first前面的元素的next指向lastnodeInOrder[last].pre = nodeInOrder[nodeInOrder[first].pre].address;//last的pre指向first前面的元素nodeInOrder[nodeInOrder[last].next].pre = nodeInOrder[first].address;//last后面的元素的pre指向firstnodeInOrder[first].next = nodeInOrder[nodeInOrder[last].next].address;//first的next指向last后面的元素}
}int main()
{//输入第一行int headAddress;//第1个结点的地址int total;//结点总个数int reverseNum;//要求反转的子链结点的个数std::cin >> headAddress >> total >> reverseNum;if (reverseNum > total)reverseNum = total;//输入后面所有行int address;int next;int data;//放进巨大的vectorstd::vector <DoubleNode> nodeInOrder(100000);int t;int preAddress = -1;for (t = 0; t < total; t++){std::cin >> address >> data >> next;nodeInOrder[address].putIn(address, data, 0, next);}//填充pre指针、统计有效个数int count = 1;nodeInOrder[headAddress].pre = -1;//第一项的pre是-1int curAddress = headAddress;//从第一项开始for (; nodeInOrder[curAddress].next != -1;){nodeInOrder[nodeInOrder[curAddress].next].pre = nodeInOrder[curAddress].address;//后一项的pre存储的是前一项的地址curAddress = nodeInOrder[curAddress].next;//cur指向下一个地址count++;}//翻转int dage;//每次走reverseNum步for (dage = 0; dage*reverseNum - 1 <= count; dage++){reverse(&nodeInOrder[0], dage, reverseNum);}//输出(todo)system("pause");
}

部分测试用例

30201 100000 16284
00000 9343 00001
00001 4716 00002
00002 1073 00003
00003 19447 00004 00004 21871 00005 00005 30688 00006 00006 12158 00007 00007 11270 00008 00008 30157 00009 00009 9063 00010 00010 30552 00011 00011 23427 00012 00012 2936 00013 00013 1069 00014 00014 20583 00015 00015 18212 00016 00016 3475 00017 00017 14522 00018 00018 16355 00019 00019 32252 00020 00020 21882 00021 00021 26837 00022 00022 6487 00023 00023 22381 00024 00024 29768 00025 00025 12644 00026 00026 22704 00027 00027 17384 00028 00028 13916 00029 00029 27364 00030 00030 10049 00031 00031 17621 00032 00032 13037 00033 00033 3588 00034 00034 22694 00035 00035 32072 00036 00036 16915 00037 00037 4342 00038 00038 10872 00039 00039 23091 00040 00040 2344 00041 00041 14630 00042 00042 28156 00043 00043 30204 00044 00044 30146 00045 00045 8283 00046 00046 26085 00047 00047 21461 00048 00048 26129 00049 00049 6965 00050 00050 29578 00051 00051 6833 00052 00052 27260 00053 00053 29695 00054 00054 4466 00055 00055 23650 00056 00056 24744 00057 00057 19020 00058 00058 22983 00059 00059 9120 00060 00060 24049 00061 00061 14968 00062 00062 17866 00063 00063 25854 00064 00064 7355 00065 00065 26633 00066 00066 13063 00067 00067 13314 00068 00068 3479 00069 00069 17401 00070 00070 20450 00071 00071 11459 00072 00072 16888 00073 00073 10864 00074 00074 8319 00075 00075 1886 00076 00076 23663 00077 00077 11922 00078 00078 10646 00079 00079 22306 00080 00080 8086 00081 00081 14623 00082 00082 10356 00083 00083 26834 00084 00084 22827 00085 00085 21548 00086 00086 12579 00087 00087 2373 00088 00088 13794 00089 00089 12151 00090 00090 26506 00091 00091 17615 00092 00092 6483 00093 00093 15232 00094 00094 26569 00095 00095 31046 00096 00096 25534 00097 00097 31989 00098 00098 30058 00099 00099 7036 00100 00100 2435 00101 00101 31259 00102 00102 2092 00103 00103 1088 00104 00104 3516 00105 00105 20498 00106 00106 30008 00107 00107 25185 00108 00108 1786 00109 00109 6243 00110 00110 6983 00111 00111 28365 00112 00112 3214 00113 00113 31439 00114 00114 11927 00115 00115 17950 00116 00116 27281 00117 00117 26345 00118 00118 282 00119 00119 2078 00120 00120 30172 00121 00121 19359 00122 00122 29087 00123 00123 7368 00124 00124 5141 00125 00125 32179 00126 00126 4107 00127 00127 18753 00128 00128 30010 00129 00129 22682 00130 00130 3013 00131 00131 22472 00132 00132 14171 00133 00133 25981 00134 00134 29806 00135 00135 25843 00136 00136 17076 00137 00137 24716 00138 00138 3598 00139 00139 15108 00140 00140 16586 00141 00141 17281 00142 00142 20078 00143 00143 17993 00144 00144 4207 00145 00145 27482 00146 00146 8223 00147 00147 22514 00148 00148 708 00149 00149 16104 00150 00150 450 00151 00151 4589 00152 00152 28557 00153 00153 16915 00154 00154 9673 00155 00155 19916 00156 00156 15484 00157 00157 1043 00158 00158 2589 00159 00159 11923 00160 00160 27465 00161 00161 14910 00162 00162 28384 00163 00163 18235 00164 00164 10569 00165 00165 1251 00166 00166 2318 00167 00167 10525 00168 00168 12621 00169 00169 29238 00170 00170 23659 00171 00171 31597 00172 00172 23184 00173 00173 10923 00174 00174 21550 00175 00175 15679 00176 00176 6899 00177 00177 29247 00178 00178 3132 00179 00179 22946 00180 00180 19900 00181 00181 31194 00182 00182 27586 00183 00183 18506 00184 00184 31629 00185 00185 4810 00186 00186 19296 00187 00187 12862 00188 00188 17670 00189 00189 10666 00190 00190 28914 00191 00191 11763 00192 00192 23492 00193 00193 12683 00194 00194 10308 00195 00195 11113 00196 00196 5692 00197 00197 16571 00198 00198 29476 00199 00199 26435 00200 00200 5844 00201 00201 16110 00202 00202 12233 00203 00203 27532 00204 00204 17883 00205 00205 13885 00206 00206 5116 00207 00207 11203 00208 00208 4153 00209 00209 18788 00210 00210 30473 00211 00211 8013 00212 00212 7896 00213 00213 7976 00214 00214 1195 00215 00215 6164 00216 00216 19161 00217 00217 10531 00218 00218 22356 00219 00219 29189 00220 00220 21696 00221 00221 3180 00222 00222 15614 00223 00223 21303 00224 00224 22211 00225 00225 17516 00226 00226 17059 00227 00227 5338 00228 00228 950 00229 00229 24283 00230 00230 5192 00231 00231 13879 00232 00232 1369 00233 00233 16706 00234 00234 3306 00235 00235 30356 00236 00236 29131 00237 00237 24133 00238 00238 15651 00239 00239 26106 00240 00240 15894 00241 00241 8601 00242 00242 27361 00243 00243 3952 00244 00244 12471 00245 00245 22220 00246 00246 1899 00247 00247 13632 00248 00248 12156 00249 00249 1499 00250 00250 7250 00251 00251 32748 00252 00252 26227 00253 00253 15800 00254 00254 14861 00255 00255 18152 00256 00256 20385 00257 00257 30925 00258 00258 28070 00259 00259 13748 00260 00260 27126 00261 00261 14367 00262 00262 1754 00263 00263 30269 00264 00264 23203 00265 00265 14749 00266 00266 32096 00267 00267 22879 00268 00268 9948 00269 00269 15138 00270 00270 22537 00271 00271 30258 00272 00272 2738 00273 00273 14777 00274 00274 20113 00275 00275 17210 00276 00276 17649 00277 00277 16432 00278 00278 7456 00279 00279 18844 00280 00280 16193 00281 00281 18901 00282 00282 30893 00283 00283 19659 00284 00284 10985 00285 00285 20707 00286 00286 2006 00287 00287 32654 00288 00288 29773 00289 00289 4481 00290 00290 12579 00291 00291 7300 00292 00292 17202 00293 00293 1975 00294 00294 12951 00295 00295 2023 00296 00296 27582 00297 00297 9372 00298 00298 5236 00299 00299 20179 00300 00300 659 00301 00301 17005 00302 00302 4415 00303 00303 19277 00304 00304 22681 00305 00305 9529 00306 00306 26873 00307 00307 29284 00308 00308 2363 00309 00309 6270 00310 00310 1034 00311 00311 26181 00312 00312 25150 00313 00313 30579 00314 00314 20407 00315 00315 10355 00316 00316 15415 00317 00317 27692 00318 00318 18842 00319 00319 17305 00320 00320 2569 00321 00321 1449 00322 00322 21701 00323 00323 22234 00324 00324 6088 00325 00325 2030 00326 00326 21343 00327 00327 9092 00328 00328 12597 00329 00329 13810 00330 00330 17809 00331 00331 15941 00332 00332 20226 00333 00333 9990 00334 00334 32397 00335 00335 27734 00336 00336 1727 00337 00337 28361 00338 00338 27904 00339 00339 9844 00340 00340 11195 00341 00341 778 00342 00342 11855 00343 00343 26784 00344 00344 2565 00345 00345 29022 00346 00346 463 00347 00347 23208 00348 00348 21129 00349 00349 23816 00350 00350 27260 00351 00351 6033 00352 00352 25561 00353 00353 24757 00354 00354 16515 00355 00355 2605 00356 00356 16520 00357 00357 24200 00358 00358 28256 00359 00359 29936 00360 00360 20335 00361 00361 5924 00362 00362 21660 00363 00363 23930 00364 00364 32281 00365 00365 23660 00366 00366 22958 00367 00367 23048 00368 00368 31827 00369 00369 22040 00370 00370 31115 00371 00371 13878 00372 00372 5877 00373 00373 14424 00374 00374 21666 00375 00375 1894 00376 00376 16775 00377 00377 5573 00378 00378 19702 00379 00379 24622 00380 00380 6280 00381 00381 16088 00382 00382 27022 00383 00383 27476 00384 00384 24701 00385 00385 28442 00386 00386 11858 00387 00387 3313 00388 00388 14170 00389 00389 9603 00390 00390 21082 00391 00391 10538 00392 00392 6763 00393 00393 5667 00394 00394 30744 00395 00395 3204 00396 00396 27775 00397 00397 9840 00398 00398 8356 00399 00399 11123 00400 00400 5244 00401 00401 23913 00402 00402 13330 00403 00403 17044

牛客网_PAT乙级_1015反转链表 (25)【没做出来】相关推荐

  1. 牛客网_PAT乙级_1020完美数列(25)【vector sort 最后一个测试用例超时】

    题目描述 给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完 ...

  2. 牛客网_PAT乙级_1019. 数字黑洞 (20)

    总结 注意!! 想要在函数中结束程序,一定不要用system("pause");,因为这样只是让程序暂停,结果就是运行时间超时,无法通过所有的测试用例. 那么,C++ 程序中什么函 ...

  3. 牛客网_PAT乙级_1010月饼 (25)

    因为黑框框里放不下,(非官网)测试用例用txt导入: 这题有一个陷阱,官网上说给非0数,测试用例却出现了0,0吨的月饼能卖507元,而且这样的月饼要最先卖,因为它的price是inf,卖掉0吨净赚50 ...

  4. 牛客网_PAT乙级_1029有几个PAT(25)【输入字符串并strlen计算长度】

    题目描述 字符串APPAPT中包含了两个单词"PAT",其中第一个PAT是第2位§,第4位(A),第6位(T):第二个PAT是第3位§,第4位(A),第6位(T). 现给定字符串, ...

  5. 牛客网_PAT乙级_1028到底买不买(20)【用iterator迭代器,对两个vectorchar比较,删除相同元素】

    题目描述 小红想买些珠子做一串自己喜欢的珠串.卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖.于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少 ...

  6. 牛客网_PAT乙级_1027在霍格沃茨找零钱(20)

    题目描述 如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可, ...

  7. 牛客网_PAT乙级_1025插入与归并(25)

    题目描述 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序 ...

  8. 牛客网_PAT乙级_1026跟奥巴马一起编程(15)

    题目描述 美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014年底,为庆祝"计算 机科学教育周"正式启动,奥巴马编写了很简 ...

  9. 牛客网_PAT乙级_10234有理数四则运算(20)【通过5/7:格式错误】

    题目描述 本题要求编写程序,计算2个有理数的和.差.积.商. 输入描述: 输入在一行中按照"a1/b1 a2/b2"的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整 ...

最新文章

  1. 机器学习资源和路线图
  2. linux 线程管理、同步机制等
  3. resource fork, Finder information, or similar detr
  4. 为什么我们最终抛弃 Chromium 选择了 Firefox ?
  5. Linux下查看系统版本号信息的方法(转)
  6. AI,大数据,复杂系统最精25本大书单(建议收藏)
  7. JAVA虚拟机创建对象
  8. 【对讲机的那点事】对讲机数字语音加密,保障通信安全
  9. 微云存储空间多大_qq微云内存多大
  10. 京东云PostgreSQL在GIS场景的应用分享
  11. PHP 网页调用本地exe程序实例
  12. 执念是惩罚自己,释怀才是与自己和解
  13. QQ第三方登录-QQ互联开发者申请的坑(个人接入,时间:2019-6-3)
  14. 新税码不显示或者税码被人隐藏,发票校验不显示
  15. Go语言学习 二十三 错误处理和运行时恐慌(Panic)
  16. vscode配置php运行环境以及xdebug
  17. [附源码]计算机毕业设计JAVA汽车票售票系统lunwen
  18. JavaScript函数中的arguments(js函数中的arguments,函数默认参数arguments)
  19. npm ERR code1
  20. 阿里云 云盾 安骑士 监控ECS离线 安全组规则 ip设置

热门文章

  1. Java怎么查找字符串大写_在Java中,如何检查字符串是否包含子字符串(忽略大小写)?...
  2. 华三交换机mode是什么意思_交换机中相关术语代表什么意思,有必要弄清楚,赶紧收藏...
  3. string基本字符系列容器
  4. 多线程学习(一)----CreateThread
  5. EventBus设计与实现分析——订阅者的注册
  6. 第49讲:实战上手,Scrapy-Redis 分布式实现
  7. Linux网络新技术基石 |​eBPF and XDP
  8. 怎么写出一份令人惊叹的设计文档?
  9. 神器 JMH + Arthas 性能监控
  10. JDK 14 调试神器了解一下?