PAT_甲级_1133 Splitting A Linked List (25point(s)) (C++)【链表重构】
原创
©著作权归作者所有:来自51CTO博客作者再见萤火虫IT的原创作品,请联系作者获取转载授权,否则将追究法律责任
目录
1,题目描述
2,思路
3,AC代码
4,解题过程
第一搏
1,题目描述
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
题目大意
将一个链表重新排序,小于0的节点先输出(原有顺序不变),小于等于K的后输出(原有顺序不变),大于K的最后输出(原有顺序不变);
2,思路
遍历链表,将三类节点分别存入A,B,C三个数组中,再将所有数组合并到A中,最后输出。
3,AC代码
#include<bits/stdc++.h>
using namespace std;
struct node{
int add, key, next;
}data[100000];
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
int head, N, K;//head头节点 N节点数目 K阈值
cin>>head>>N>>K;
int add, key, next, i;
for(i = 0; i < N; i++){
cin>>add>>key>>next;
data[add] = {add, key, next};
}
add = head;
vector<node> A, B, C;//A小于0的 B小于阈值的 C其他的
while(add != -1){
if(data[add].key < 0)
A.push_back(data[add]);
else if(data[add].key <= K)
B.push_back(data[add]);
else
C.push_back(data[add]);
add = data[add].next;
}
for(i = 0; i < B.size(); i++)
A.push_back(B[i]);
for(i = 0; i < C.size(); i++)
A.push_back(C[i]);
for(i = 0; i < A.size()-1; i++)
printf("%05d %d %05d\n", A[i].add, A[i].key, A[i+1].add);
printf("%05d %d %d", A[i].add, A[i].key, -1);
return 0;
}
4,解题过程
第一搏
最粗暴的解法了,分别存入A,B,C三个数组中,再将所有数组合并到A中,最后输出。
时间炸裂,但代码简单,而且不容易出错。。。