当前位置:   article > 正文

PTA L2-022 重排链表

PTA L2-022 重排链表

给定一个单链表 L1​→L2​→⋯→Ln−1​→Ln​,请编写程序将链表重新排列为 Ln​→L1​→Ln−1​→L2​→⋯。例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3。

输入格式:

每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址和结点总个数,即正整数N (≤105)。结点的地址是5位非负整数,NULL地址用−1表示。

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

Address Data Next

其中Address是结点地址;Data是该结点保存的数据,为不超过105的正整数;Next是下一结点的地址。题目保证给出的链表上至少有两个结点。

输出格式:

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

输入样例:

  1. 00100 6
  2. 00000 4 99999
  3. 00100 1 12309
  4. 68237 6 -1
  5. 33218 3 00000
  6. 99999 5 68237
  7. 12309 2 33218

输出样例:

  1. 68237 6 00100
  2. 00100 1 99999
  3. 99999 5 12309
  4. 12309 2 00000
  5. 00000 4 33218
  6. 33218 3 -1

做法:

测试点3的坑点:有多余节点,也就是有节点不在链表上。

1.根据题目信息建立单链表

2.将单链表扩充成双向链表

3.按题目要求输出结果。

注:输出时,先输出尾,再输出头,即是题目要求的输出。

代码:

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <cstring>
  5. using namespace std;
  6. const int N = 100010;
  7. int e[N],l[N],r[N],id;
  8. int main()
  9. {
  10. int head = 0,n = 0;
  11. scanf("%d%d",&head,&n);
  12. for(int i = 0;i < n;i++)
  13. {
  14. int address = 0,data = 0,next = 0;
  15. scanf("%d%d%d",&address,&data,&next);
  16. e[address] = data;r[address] = next;
  17. }
  18. l[head] = -1;
  19. int back = head;//建立双向链表
  20. for(int i = r[head],j = head,cnt = 0;i != -1;i = r[i],j = r[j])
  21. {
  22. l[i] = j;
  23. if(r[i] == -1) back = i;
  24. n = ++cnt;
  25. }
  26. n++;//测试点3的坑,有多余的节点。
  27. // cout << head << " " << back << endl;
  28. for(int i = 0,h = head,b = back;i < n;i ++)//h头指针,b尾指针
  29. {
  30. if(i % 2 == 0)
  31. {
  32. printf("%05d %d ",b,e[b]);
  33. if(i == n - 1)puts("-1");
  34. else printf("%05d\n",h);
  35. b = l[b];
  36. }
  37. else
  38. {
  39. printf("%05d %d ",h,e[h]);
  40. if(i == n - 1) puts("-1");
  41. else printf("%05d\n",b);
  42. h = r[h];
  43. }
  44. }
  45. return 0;
  46. }

结果: 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/277798?site
推荐阅读
相关标签
  

闽ICP备14008679号