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 (≤105) which is the total number of nodes, and a positive K (≤103). 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 [−105,105], 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
/**
此题题意就是:给定一个链表, 将值为负数的数字放在 链表的前面, 将值为[0,k]
范围的值放在链表的中间,其他的数字放在链表的后面, 放置时不能改变链表的原顺序
本题思路:
1.用非结构体实现存储链表, data[i]数组存储链表的值(地址为i的值), Next[i]数组存储
地址为i的下一个地址,
2.设定3个向量数组 a b c分别存储满足3种不同条件的结点
3.最后输出时为了 避免输出麻烦(会判断 b 数组 ,c数组是否为空)因此直接采用合并向量数组
合并的方法为: a.insert(a.end(), b.begin(), b.end());(表示将a数组的末尾, 合并到b数组
的第一个位置到最后一个位置)
**/
#include<iostream>
#include<vector>
using namespace std;
const int maxsize = 1e5 + 5;
int start, n, k, cnt = 0;
int data[maxsize], Next[maxsize];
vector<int> a, b, c;
void printfLink(vector<int> l){
cnt++;
if(l.empty()) //这道题保证了不为空
return;
for(int i = 0; i < l.size(); i++){
printf("%05d %d ", l[i], data[l[i]]);
if(i != l.size() - 1)
printf("%05d\n", l[i + 1]);
else
printf("-1\n");
}
}
int main(){
scanf("%d%d%d", &start, &n, &k);
for(int i = 0; i < n; i++){
int ad;
scanf("%d", &ad);
scanf("%d%d", &data[ad], &Next[ad]);
}
while(start != -1){
if(data[start] < 0)
a.push_back(start);
else if(data[start] >= 0 && data[start] <= k)
b.push_back(start);
else
c.push_back(start);
start = Next[start];
}
a.insert(a.end(), b.begin(), b.end()); //合并两个vector
a.insert(a.end(), c.begin(), c.end());
printfLink(a);
return 0;
}