题目链接

题目描述

给定一个单链表 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是下一结点的地址。题目保证给出的链表上至少有两个结点。

输出格式:

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

输入样例:

00100 6

00000 4 99999

00100 1 12309

68237 6 -1

33218 3 00000

99999 5 68237

12309 2 33218

输出样例:

68237 6 00100

00100 1 99999

99999 5 12309

12309 2 00000

00000 4 33218

33218 3 -1

分析:

用数组来模拟链表,如果只是简单的将链表输出来,那么应该没有任何的问题,关键在于如何给链表重新排序。

我们给每个节点添加一个代表它是链表中的第几个节点的元素index,这样就可以根据index的大小给链表进行排序。

排序的规则就是原来的链表中的前一半的节点依序成为新的链表中的第2,4,6···个,后一半的节点倒着依序成为新的链表中的第1,3,5···个。

这样就可以根据该表节点的index属性,来改变节点在链表中的位置。

代码:

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<algorithm>
  4. using namespace std;
  5. struct Node
  6. {
  7. int address;//地址
  8. int data;//数据
  9. int next;//下地址
  10. int index=100001;//在链表中的位置
  11. } node[100009];
  12. bool cmp(Node a,Node b)//按照在链表中的位置从小到大排序
  13. {
  14. return a.index<b.index;
  15. }
  16. int main()
  17. {
  18. int start,n;
  19. scanf("%d%d",&start,&n);
  20. int adr;
  21. for(int i=0; i<n; i++)
  22. {
  23. scanf("%d",&adr);
  24. node[adr].address=adr;
  25. scanf("%d%d",&node[adr].data,&node[adr].next);
  26. }
  27. int num=0;//表示有效节点的个数,有时候有效节点的个数不一定为n(看别人题解看出来的,我也不知道为啥有这种不合理数据,反正被坑到了)
  28. //将链表按照最开始的顺序排列出来
  29. while(start!=-1)
  30. {
  31. node[start].index=num;
  32. num++;
  33. start=node[start].next;
  34. }
  35. sort(node,node+100009,cmp);
  36. //根据链表的重新排序规则可以发现,前一半分别为第2,4,6--个
  37. //后一半分别为第1,3,5--个,这样就可以根据这个规律将节点的位置改变
  38. int index=1;
  39. for(int i=0; i<num/2; i++)
  40. {
  41. node[i].index=index;
  42. index+=2;
  43. }
  44. index=0;
  45. for(int i=num-1; i>=num/2; i--)
  46. {
  47. node[i].index=index;
  48. index+=2;
  49. }
  50. sort(node,node+100009,cmp);
  51. for(int i = 0; i < num-1; i++)//将下一个节点的地址改变了
  52. node[i].next = node[i+1].address;
  53. node[num-1].next = -1;
  54. for(int i = 0; i < num; i++)
  55. {
  56. printf("%05d %d ", node[i].address, node[i].data);
  57. if(i != num-1) printf("%05d\n", node[i].next);
  58. else printf("%d\n", node[i].next);
  59. }
  60. return 0;
  61. }

天梯赛 L2-022. (数组模拟链表) 重排链表的更多相关文章

  1. PTA天梯赛L2

    L2-001 紧急救援 题意:就是给你一张n<500的图:让你求最短路径,最短路条数,以及路径: 做法,先用dijkstra求最短路,然后dfs找最短路条数,以及点权的最大值: 一般dfs不就可 ...

  2. PAT 天梯赛 L1-027. 出租 【模拟】

    题目链接 https://www.patest.cn/contests/gplt/L1-027 题意 给出一串电话号码,找出其中不同数字的个数,并且按递减顺序排列,然后 有一个index 数组,指出每 ...

  3. POJ - 3476 A Game with Colored Balls---优先队列+链表(用数组模拟)

    题目链接: https://cn.vjudge.net/problem/POJ-3476 题目大意: 一串长度为N的彩球,编号为1-N,每个球的颜色为R,G,B,给出它们的颜色,然后进行如下操作: 每 ...

  4. 【Weiss】【第03章】练习3.25:数组模拟队列

    [练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空 ...

  5. pat甲级 团体天梯赛 L2-022. 重排链表

    L2-022. 重排链表 时间限制 500 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一个单链表 L1→L2→...→Ln-1→Ln,请 ...

  6. GPLT天梯赛 L2-022. 重排链表

    L2-022. 重排链表 时间限制 500 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一个单链表 L1→L2→...→Ln-1→Ln,请 ...

  7. 团体程序设计天梯赛-练习集L2-002. 链表去重

    L2-002. 链表去重 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一个带整数键值的单链表L,本题要求你编写程序,删除 ...

  8. PAT 天梯赛 L2-002 链表去重

    模拟单链表的增删操作 题目链接:https://www.patest.cn/contests/gplt/L2-002 题解 最开始我脑抽用map模拟单链表进行操作,因为这样可以节约空间,并且用了cin ...

  9. Problem UVA12657-Boxes in a Line(数组模拟双链表)

    Problem UVA12657-Boxes in a Line Accept: 725  Submit: 9255 Time Limit: 1000 mSec Problem Description ...

随机推荐

  1. 将utf-8的中文或者字符都看成一个字符

    function utf8_strlen($string=null){ // 将字符串分解为单元 preg_match_all("/./us", $string, $match); ...

  2. DispatcherServlet的url mapping为“/”时,对根路径访问的处理

    背景 众所周知,Tomcat的Default Servlet的servlet-mapping为 <servlet-mapping> <servlet-name>default& ...

  3. Nginx在Linux上的安装和配置

    链接:http://www.cnblogs.com/wbyp/p/7737224.html

  4. Gson获取json串中的key-value

    1.依赖包 <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson& ...

  5. 【BZOJ5334】数学计算(线段树)

    [BZOJ5334]数学计算(线段树) 题面 BZOJ 洛谷 题解 简单的线段树模板题??? 咕咕咕. #include<iostream> #include<cstdio> ...

  6. 如何在Eclipse 中查看(如Objects)的源代码

    今天突然想看Objects的源码,结果失败了,总结了一下,贴出来. 一般查看源码的流程: 使用快捷键Ctri+Shit+T出现Open Type的对话框,在里面直接输入类名,回车就行: 在Eclips ...

  7. BZOJ2159 Crash 的文明世界 【第二类斯特林数 + 树形dp】

    题目链接 BZOJ2159 题解 显然不能直接做点分之类的,观察式子中存在式子\(n^k\) 可以考虑到 \[n^k = \sum\limits_{i = 0} \begin{Bmatrix} k \ ...

  8. phpredis用法笔记

    项目中用到redis集群, 发现phpredis对集群,分布式是有支持的.翻译下相关资料备用. redis扩展地址:https://github.com/phpredis/phpredis, 看到如下 ...

  9. JS的语法

    1.语句和表达式 var a = 3 * 6; var b = a; b; 这里,3 * 6是一个表达式(结果为18).第二行的a也是一个表达式,第三行的b也是.表达式a和b的结果值都是18. var ...

  10. Android listview与adapter用法(BaseAdapter + getView)

    Android listview与adapter用法http://www.cnblogs.com/zhengbeibei/archive/2013/05/14/3078805.html package ...