问题描述
将链表按照规则分类,负数在前面,0-K在中间,>K在最后,但是元素之间保持原顺序不变。
题目分析
我们可以创建不同的数组,分别用来存储首地址,尾地址和数据。其中数据和尾地址的索引都是首地址,这么存储可以形成一个类似hash的数据结构。
首地址数组是按照连接顺序存储的首地址,再开辟另一个数组用来存储排好序的首地址。
我们利用这几个数组就可以开始折腾了,首先遍历整个首地址数组,取出首地址对数据进行索引,判断数据大小即可。
在这里需要注意顺序,我们要按照排序的顺序进行处理,首先先对负数数据排序,再对0-K排序,最后才是对>K排序。
代码
mi#include<iostream>
using namespace std;
//datas用来存储数据,索引为首地址
//nexts用来存储首地址对应的尾地址
//list用来存储每个结点的首地址
//order用来存储排完序后每个结点的首地址
int datas[100005],nexts[100005],list[100005],order[100005];
int main()
{
int firstAddress,Address,N,K;
cin>>firstAddress>>N>>K;
for(int i = 0;i < N;i++)
{
cin>>Address;
cin>>datas[Address]>>nexts[Address];
}
int sum = 0,x = 0;
while(firstAddress != -1)
{
list[sum++] = firstAddress;
//当前结点的next结点将作为下一个头结点
firstAddress = nexts[firstAddress];
}
//这里强调一下,顺序不能换,我们按照题目要求的排列顺序对不同数据进处理
//先处理负数,然后是0-K,最后是>K
for(int i = 0;i < sum;i++)
{
if(datas[list[i]] < 0)
order[x++] = list[i];
}
for(int i = 0;i < sum;i++)
{
if(datas[list[i]] >= 0 && datas[list[i]] <= K)
order[x++] = list[i];
}
for(int i = 0;i < sum;i++)
{
if(datas[list[i]] > K)
order[x++] = list[i];
}
//输出
for(int i=0;i<sum-1;i++)
{
printf("%05d %d %05d\n", order[i], datas[order[i]], order[i + 1]);
}
printf("%05d %d -1", order[sum - 1], datas[order[sum - 1]]);
return 0;
}
总结
答题用时18min
Q75——finish√