tema
Dada una lista enlazada individualmente, escriba un programa para ordenar y organizar los elementos de la lista enlazada de modo que todos los elementos negativos estén ordenados delante de los elementos no negativos, y los elementos en el intervalo [0, K] estén ordenados delante de los elementos mayores que K. Pero el orden de cada tipo de elementos internos no se puede cambiar. Por ejemplo: la lista vinculada dada es 18 → 7 → -4 → 0 → 5 → -6 → 10 → 11 → -2, K es 10, la salida debe ser -4 → -6 → -2 → 7 → 0 → 5 → 10 → 18 → 11.
Formato de entrada:
Cada entrada contiene un caso de prueba. La primera línea de cada caso de prueba da: la dirección del primer nodo; el número total de nodos, que es un entero positivo N (≤ 1 0 5) N (≤10 ^ 5)N ( ≤1 05 ); y entero positivoK (≤ 1 0 3) K (≤10 ^ 3)K ( ≤1 03 ). La dirección del nodo es un entero no negativo de 5 bits y la dirección NULL está representada por -1.
A continuación, hay N líneas, cada una de las cuales tiene el formato:
Address Data Next
Donde Dirección es la dirección del nodo; Datos son los datos guardados por el nodo, que es [- 1 0 5, 1 0 5] [−10 ^ 5,10 ^ 5][ - 1 05 ,1 05 ]Entero en el intervalo; Siguiente es la dirección del siguiente nodo. La pregunta garantiza que la lista enlazada proporcionada no está vacía.
Formato de salida:
Para cada caso de prueba, la lista enlazada de resultados reorganizados se emite en el orden desde el principio hasta el final de la lista enlazada, y cada nodo ocupa una fila con el mismo formato que la entrada.
Muestra de entrada:
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
Salida de muestra:
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
Análisis de pensamiento:
Use la matriz para simular la lista vinculada y guarde las tres partes menores que 0, 0 ~ k y mayores que k en el vector.
Código:
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 100010;
int head, idx, e[maxn], ne[maxn], n, k;
vector<int> v[3];
int main(){
cin >> head >> n >> k;
for(int i = 0; i < n; i++){
cin >> idx;
cin >> e[idx] >> ne[idx];
}
int p = head;
while(p != -1){
int data = e[p];
if(data < 0)
v[0].push_back(p);
else if(data >= 0 && data <= k)
v[1].push_back(p);
else
v[2].push_back(p);
p = ne[p];
}
int flag = 0;
for(int i = 0; i < 3; i++){
for(int j = 0; j < v[i].size(); j++){
if(flag == 0){
printf("%05d %d ", v[i][j], e[v[i][j]]);
flag = 1;
}else{
printf("%05d\n%05d %d ", v[i][j], v[i][j], e[v[i][j]]);
}
}
}
cout << "-1" << endl;
return 0;
}