[MOOC] 02-Estructura lineal 3 Lista enlazada inversa (25 puntos) (dos pases)

Dada una constante K y una lista L enlazada individualmente, se supone que debe invertir los enlaces de cada K elementos en L.Por ejemplo, dado que L es 1 → 2 → 3 → 4 → 5 → 6, si K = 3, entonces debe emitir 3 → 2 → 1 → 6 → 5 → 4; si K = 4, debe generar 4 → 3 → 2 → 1 → 5 → 6.

Especificación de entrada:
cada archivo de entrada contiene un caso de prueba. Para cada caso, la primera línea contiene la dirección del primer nodo, un N positivo (≤105) que es el número total de nodos, y un K positivo (≤N) que es la longitud de la sublista a revertir. La dirección de un nodo es un número entero no negativo de 5 dígitos y NULL está representado por -1.

Luego siguen N líneas, cada una describe un nodo en el formato:

Dirección de datos Siguiente
donde Dirección es la posición del nodo, Datos es un número entero y Siguiente es la posición del siguiente nodo.

Especificación de salida:
Para cada caso, genere la lista enlazada ordenada resultante. Cada nodo ocupa una línea y se imprime en el mismo formato que en la entrada.

Entrada de muestra:

00100 6 4
00000 4 99999
00100 1 12309
68237
6-1 33218 3 00000
99999 5 68237
12309 2 33218

Salida de muestra:

00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6-1

Ya hice esta pregunta antes, pero está en el Nivel B. No sabía cómo hacerlo en ese momento. Lo aprendí refiriéndome a lo que escribí. Esta vez tuve una idea tan pronto como vi esta pregunta. Solo espero que no sea un pensamiento de estilo fijo. Dos puntos de prueba, 4 puntos. . La segunda vez obtuve la máxima puntuación. La razón es que el resultado final debería ser v [i + 1]. Obtuve el siguiente de v [i] y estaba mal. Algunos nodos no están necesariamente en la lista vinculada. Esto es Un hoyo en esta pregunta, pensé que era un hoyo cuando lo hice antes. Por desgracia, todavía estaba perforado esta vez, por lo que necesitamos registrar el número efectivo. Aquí, debido al vector utilizado, podemos registrarlo directamente con su tamaño en lugar de un contador. La práctica de la pregunta del enlace a continuación es la misma que esta idea, puede escribir en comparación

1-10 Eliminación de la lista vinculada (20 puntos) (dos veces)

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

typedef struct{
    
    
	int data;
	int next;
}Node;

Node node[100005];
vector<int> v;

int main(){
    
    
	ios::sync_with_stdio(false);
	int head,n,k;
	cin >> head >> n >> k;
	for(int i = 0;i<n;i++){
    
    
		int add;
		cin >> add;
		cin >> node[add].data >> node[add].next;
	}
	while(head!=-1){
    
    
		v.push_back(head);
		head = node[head].next;
	}
	int len = v.size();
	for(int i = 0;i<(len-len%k);i+=k){
    
    
		reverse(v.begin()+i,v.begin()+i+k);
	}
	for(int i = 0;i<len-1;i++){
    
    
		printf("%05d %d %05d\n",v[i],node[v[i]].data,v[i+1]);
	}
	printf("%05d %d -1\n",v[len-1],node[v[len-1]].data);
	return 0;
} 

Supongo que te gusta

Origin blog.csdn.net/weixin_45845039/article/details/108720440
Recomendado
Clasificación