目录

​1,题目描述​

​2,思路​

​3,AC代码​

​4,解题过程​

​第一搏​


1,题目描述

PAT_甲级_1133 Splitting A Linked List (25point(s)) (C++)【链表重构】_甲级

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中,最后输出。

时间炸裂,但代码简单,而且不容易出错。。。

PAT_甲级_1133 Splitting A Linked List (25point(s)) (C++)【链表重构】_PAT_02