【1074】Reversing Linked List (25 分)

举报
野猪佩奇996 发表于 2022/01/23 02:18:32 2022/01/23
【摘要】 下面方法感觉好麻烦。。。 感觉黎大佬的做法更简单https://blog.csdn.net/qq_33657357/article/details/80407542 #include<iostream>#include<stdio.h>#include<stdlib.h>#include<m...

下面方法感觉好麻烦。。。

感觉黎大佬的做法更简单https://blog.csdn.net/qq_33657357/article/details/80407542


  
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<math.h>
  5. #include<string.h>
  6. #include<algorithm>
  7. #include<map>
  8. #include<vector>
  9. #include<queue>
  10. using namespace std;
  11. const int maxn=100010;
  12. //算法de思路:结点结构体的order初始化为maxn(无效结点),再按照静态链表结点排序(order依次赋值)
  13. 五个步骤,key:第五个中对每一块最后一个结点的next地址的处理
  14. //定义静态链表(步骤1)
  15. struct Node{
  16. int address,data,next;
  17. int order; //结点在链表中的序号,无效结点记为maxn
  18. }node[maxn];
  19. bool cmp(Node a,Node b){
  20. return a.order<b.order; //按order从小到大排序
  21. }
  22. int main(){
  23. //初始化(步骤2)
  24. for(int i=0;i<maxn;i++){
  25. node[i].order=maxn; //初始化全部为无效结点
  26. }
  27. int begin,n,K,address;
  28. scanf("%d%d%d",&begin,&n,&K); //起始地址,结点个数,步长
  29. //初始化静态链表
  30. for(int i=0;i<n;i++){
  31. scanf("%d",&address);
  32. scanf("%d%d",&node[address].data,&node[address].next);
  33. node[address].address=address; //别漏了这步,“两个”address不同
  34. }
  35. int p=begin,count=0; //count计数有效结点的数目
  36. //遍历链表找出单链表的所有有效结点(步骤3)
  37. while(p!=-1){
  38. node[p].order=count++; //结点在单链表中的序号
  39. p=node[p].next; //下一个结点
  40. }
  41. //按单链表从头到尾顺序排列(步骤4)
  42. sort(node ,node+maxn,cmp);
  43. //有效结点为前count个结点,为了书写方便就把count赋值给n
  44. n=count;
  45. //单链表已经形成,按照题目要求输出(步骤5)
  46. for(int i=0;i<n/K;i++){ //枚举完整的n/K块
  47. for(int j=(i+1)*K-1 ; j>i*K; j-- ){ //第i块倒着输出
  48. printf("%05d %d %05d\n",node[j].address, node[j].data, node[j-1].address);
  49. }
  50. //下面是每一块的最后一个结点的next地址的处理
  51. printf("%05d %d ",node[i*K].address,node[i*K].data);
  52. if(i<n/K-1){ //如果不是最后一块,就指向下一块的最后一个结点
  53. printf("%05d\n",node[ (i+2)*K-1 ].address );
  54. }else{ //如果是最后一块时
  55. if(n%K==0) { //恰好是最后一个结点时,输出-1
  56. printf("-1\n");
  57. }else{ //剩下不完整的块按照原先的顺序输出
  58. printf("%05d\n",node[ (i+1)*K ].address);//注意换行符
  59. for(int i=n/K*K ; i<n ;i++){
  60. printf("%05d %d ",node[i].address,node[i].data);
  61. if(i<n-1){
  62. printf("%05d\n",node[i+1].address);
  63. }else{
  64. printf("-1\n");
  65. }
  66. }
  67. }
  68. }
  69. }
  70. system("pause");
  71. return 0;
  72. }

 

文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。

原文链接:andyguo.blog.csdn.net/article/details/98447827

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。