您的位置:首页 > 其它

PAT甲级——1133 Splitting A Linked List (25 分)

2019-04-01 12:06 260 查看

1133 Splitting A Linked List (25 分)

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:

[code]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:

[code]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:

[code]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

题目大意:给出一个链表,根据节点的值将它分成三部分:负数、[0, K]、>K; 每个部分里面的节点的相对顺序不变。

解法比较暴力,用vector存储数据,多次遍历即可,如果用链表的话代码写起来比较繁琐也没必要节省这么点内存和运行时间。

[code]#include<iostream>
#include<unordered_map>
#include<vector>
using namespace std;
struct node{
int address,data,next;
};
int main()
{
int head,N,K,i;
scanf("%d%d%d",&head,&N,&K);
unordered_map<int,node> mp;
vector<node> List,SpList;
for(i=0;i<N;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
mp[a]={a,b,c};
}
while(head!=-1){
List.push_back(mp[head]);
head=mp[head].next;
}
for(i=0;i<List.size();i++)
if(List[i].data<0) SpList.push_back(List[i]);
for(i=0;i<List.size();i++)
if(List[i].data<=K&&List[i].data>=0) SpList.push_back(List[i]);
for(i=0;i<List.size();i++)
if(List[i].data>K) SpList.push_back(List[i]);
for(i=0;i<SpList.size();i++)
if(i<SpList.size()-1)
printf("%05d %d %05d\n",SpList[i].address,SpList[i].data,SpList[i+1].address);
else
printf("%05d %d %d\n",SpList[i].address,SpList[i].data,-1);
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: