Given a singly linked list, you are supposed to rearrange its elements so that all the negative values appear before all of the non-negatives, and all the values in [0, K] appear before all those greater than K. The order of the elements inside each class must not be changed. For example, given the list being 18→7→-4→0→5→-6→10→11→-2 and K being 10, you must output -4→-6→-2→7→0→5→10→18→11.

Input Specification:

Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (≤10​5​​) which is the total number of nodes, and a positive K (≤10​3​​). The address of a node is a 5-digit nonnegative integer, and NULL is represented by −1.

Then N lines follow, each describes a node in the format:

Address Data Next

where Address is the position of the node, Data is an integer in [−10​5​​,10​5​​], and Next is the position of the next node. It is guaranteed that the list is not empty.

Output Specification:

For each case, output in order (from beginning to the end of the list) the resulting linked list. Each node occupies a line, and is printed in the same format as in the input.

Sample Input:

00100 9 10
23333 10 27777
00000 0 99999
00100 18 12309
68237 -6 23333
33218 -4 00000
48652 -2 -1
99999 5 68237
27777 11 48652
12309 7 33218

Sample Output:

33218 -4 68237
68237 -6 48652
48652 -2 12309
12309 7 00000
00000 0 99999
99999 5 23333
23333 10 00100
00100 18 27777
27777 11 -1

 #include <stdio.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn=;
struct node{
int data;
int pos=;
int address;
int next;
int rank;
}nodes[maxn];
vector<node> v;
int n,k,root;
bool cmp(node n1,node n2){
if(n1.rank<n2.rank) return true;
else if(n1.rank>n2.rank) return false;
else{
return n1.pos<n2.pos;
}
}
int main(){
scanf("%d %d %d",&root,&n,&k);
for(int i=;i<n;i++){
int first,data,next;
scanf("%d %d %d",&first,&data,&next);
node tmp;
tmp.address = first;
tmp.data = data;
tmp.next = next;
if(data<) tmp.rank=;
else if(data<=k) tmp.rank=;
else tmp.rank=;
nodes[first]=tmp;
//v.push_back(tmp);
}
int j=;
while(root!=-){
nodes[root].pos=j;
v.push_back(nodes[root]);
root=nodes[root].next;
j++;
}
sort(v.begin(),v.end(),cmp);
for(int i=;i<v.size();i++){
if(i!=v.size()-){
printf("%05d %d %05d\n",v[i].address,v[i].data,v[i+].address);
}
else {
printf("%05d %d -1\n",v[i].address,v[i].data);
}
}
}

注意点:看到只想着排序了,看大佬的方法真简单,直接三个vector,再合起来打印输出。

一开始最后第二个测试点,最后一个超时,超时是因为一开始存数据直接存在vector里,然后要得到正确的顺序每次都要遍历一遍整个vector,时间复杂度很高。而且最开始的pos其实设置的也是有问题的,直接根据输入顺序得到了,神奇的是结果居然前几个都是对的。

最后存储链表还是要用静态数组,不能用vector,找next太耗时

最新文章

  1. 跨域资源共享(CORS)在ASP.NET Web API中是如何实现的?
  2. centeros bash: ifconfig: command not found
  3. css编写规范
  4. 【BZOJ】1407 NOI 2002 荒岛野人Savage
  5. 实验七 状态机设计ADC0809采样控制电路
  6. Compare Strings
  7. 《算法导论》习题解答 Chapter 22.1-8(变换邻接表的数据结构)
  8. FiddlerScript开发
  9. DNS服务器安装配置案例详解
  10. 用 Qt 中的 QDomDocument类 处理 XML 文件(下)
  11. ARM驱动调试方法、思路总结、笔记
  12. zencart侧边导航点击一级目录展开二级目录
  13. 枚举:enum——初写
  14. 《JavaScript高级程序设计》笔记:事件(十三)
  15. Confluence 6 在 Apache 或者系统级别阻止垃圾
  16. nginx的启动、停止、重载配置、验证配置
  17. 换上 SansForgetica-Regular 字体,增加记忆能力
  18. MacOs -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
  19. 使用DirectX作渲染过程
  20. WIFEXITED WEXITSTATUS WIFSIGNALED(转)

热门文章

  1. fast-spring-boot快速开发项目
  2. 本地navicate for mysql怎么修改密码?
  3. canvas-star0.html
  4. 洛谷P3346 [ZJOI2015]诸神眷顾的幻想乡(广义后缀自动机)
  5. 开源IDE code blocks黑色主题
  6. Apex 的异常处理
  7. plt 数据可视化
  8. mac下载的excel如果带有超链接,url被转义问题
  9. Scrapy爬虫入门
  10. 洗礼灵魂,修炼python(30)--装饰器(2)—&gt;装饰器总结+进阶使用