Una lista doblemente enlazada es una estructura de datos en la que cada nodo tiene un value
"enlace" tanto con el previous
siguiente como nodes
en el siguiente . Por ejemplo, considere los siguientes nodos con valores 12, 99 y 37:
Aquí, los nodos con valores 12 y 99 apuntan a sus respectivos next
nodos, con valores 99 y 37 . El nodo con el valor 37 no tiene next
puntero porque es el último nodo de la lista. Del mismo modo, los nodos con valores 99 y 37 apuntan a sus respectivos previous
nodos, 12 y 99 , pero 12 no tiene previous
puntero porque es el primer nodo de la lista.
La puesta en marcha
En la práctica, los "enlaces" de un nodo se implementan como punteros a las ubicaciones del nodo anterior y siguiente en la memoria. Para nuestros propósitos, la "memoria" será una matriz de nodos y la ubicación de un nodo será su índice en la matriz. Un nodo puede considerarse como una 3-tupla de la forma ( prev value next )
. El ejemplo anterior, entonces, podría verse así:
Pero podría verse así, en cambio:
Comenzando en cualquier nodo, puede seguir los previous
enlaces (que se muestran como los orígenes de las flechas rojas) para llegar a los nodos que lo preceden y los next
enlaces (flechas verdes) para encontrar los nodos posteriores para obtener todos los valores de los nodos en orden: [12, 99, 37]
.
El primer diagrama de arriba podría representarse en una matriz como [[null, 12, 1], [0, 99, 2], [1, 37, null]]
. El segundo, entonces, sería [[2, 99, 1], [0, 37, null], [null, 12, 0]]
.
El reto
Escriba un programa que tome como entrada una matriz de nodos y el índice de un nodo y devuelva, en orden de lista, los valores de los nodos en la misma lista doblemente vinculada.
Una complicación
La "memoria" no siempre contendrá los nodos de una sola lista. Puede contener varias listas:
La matriz anterior contiene tres listas doblemente vinculadas, codificadas por colores para su conveniencia:
Los nodos en los índices
7
,10
,1
,4
,3
,12
(mostrando sólo losnext
enlaces para reducir el desorden; haga clic para ampliar):Dada esta matriz y cualquiera de estos índices, su programa debería devolver, en orden, los valores
[0, 1, 1, 2, 3, 5, 8]
.El nodo en el índice
9
:Dado el índice
9
, su programa debería regresar[99]
.Los nodos en índices
11
,8
,0
,6
,2
:Dado uno de estos índices, debería volver
[2, 3, 5, 7, 11]
.
Reglas
Entrada
Su programa recibirá como entrada:
Una lista de 𝒏 nodos (3-tuplas como se describió anteriormente), donde 1 ≤ 𝒏 ≤ 1,000, en cualquier formato conveniente, por ejemplo, una matriz de matrices, una matriz "plana" de enteros con longitud 3𝒏, etc.
Elementos Los 3-tuplas pueden estar en cualquier orden:
( prev value next )
,( next prev value )
, etc. Para cada nodo,prev
ynext
seránnull
(u otro valor conveniente, por ejemplo-1
), indicando el primer o último nodo en una lista doblemente enlazada, o un índice válido de la lista, ya sea basada en 0 o en 1 como sea conveniente.value
será un entero de 32 bits con signo o el tipo entero más grande que admita su idioma, el que sea más pequeño.El índice 𝒑 de un nodo en la lista (1). El nodo indicado puede ser el primer nodo en una lista doblemente vinculada, el último nodo, un nodo intermedio o incluso el único nodo.
La lista de entrada (1) puede contener datos patológicos (p. Ej. Ciclos, nodos señalados por varios otros nodos, etc.), pero el índice de entrada (2) siempre apuntará a un nodo desde el que se puede obtener una salida bien formada. deducido
Salida
Su programa debería generar los valores de los nodos de la lista doblemente vinculada de la cual el nodo en el índice a es miembro, en orden de lista. La salida puede estar en cualquier formato conveniente, pero sus datos deben incluir solo los nodos value
.
Victorioso
Este es el código de golf . La respuesta más corta en bytes gana. Se aplican lagunas estándar.
Casos de prueba
A continuación, cada caso de prueba tiene la forma:
X)
prev value next, prev value next, ...
index
value value value ...
... donde X
hay una letra para identificar el caso de prueba, la segunda línea es la lista de entrada, la tercera línea es el índice de entrada basado en 0 y la cuarta línea es la salida.
A) null 12 1, 0 99 2, 1 37 null
1
12 99 37
B) 2 99 1, 0 37 null, null 12 0
1
12 99 37
C) 8 5 6, 10 1 4, 6 11 null, 4 3 12, 1 2 3, 12 8 null, 0 7 2, null 0 10, 11 3 0, null 99 null, 7 1 1, null 2 8, 3 5 5
4
0 1 1 2 3 5 8
D) 8 5 6, 10 1 4, 6 11 null, 4 3 12, 1 2 3, 12 8 null, 0 7 2, null 0 10, 11 3 0, null 99 null, 7 1 1, null 2 8, 3 5 5
0
2 3 5 7 11
E) 8 5 6, 10 1 4, 6 11 null, 4 3 12, 1 2 3, 12 8 null, 0 7 2, null 0 10, 11 3 0, null 99 null, 7 1 1, null 2 8, 3 5 5
9
99
F) 13 80 18, 18 71 null, 5 10 19, 12 1 8, 19 21 null, 31 6 2, 17 5 26, 26 0 30, 3 -1 25, null 1 23, 27 6 17, 14 1 24, 28 -1 3, null 80 0, 20 4 11, 33 6 29, 24 9 33, 10 7 6, 0 67 1, 2 15 4, 32 1 14, null 1 31, 29 3 null, 9 -1 28, 11 5 16, 8 1 null, 6 3 7, null 8 10, 23 1 12, 15 5 22, 7 9 null, 21 3 5, null 3 20, 16 2 15
18
80 80 67 71
G) 13 80 18, 18 71 null, 5 10 19, 12 1 8, 19 21 null, 31 6 2, 17 5 26, 26 0 30, 3 -1 25, null 1 23, 27 6 17, 14 1 24, 28 -1 3, null 80 0, 20 4 11, 33 6 29, 24 9 33, 10 7 6, 0 67 1, 2 15 4, 32 1 14, null 1 31, 29 3 null, 9 -1 28, 11 5 16, 8 1 null, 6 3 7, null 8 10, 23 1 12, 15 5 22, 7 9 null, 21 3 5, null 3 20, 16 2 15
8
1 -1 1 -1 1 -1 1
H) 13 80 18, 18 71 null, 5 10 19, 12 1 8, 19 21 null, 31 6 2, 17 5 26, 26 0 30, 3 -1 25, null 1 23, 27 6 17, 14 1 24, 28 -1 3, null 80 0, 20 4 11, 33 6 29, 24 9 33, 10 7 6, 0 67 1, 2 15 4, 32 1 14, null 1 31, 29 3 null, 9 -1 28, 11 5 16, 8 1 null, 6 3 7, null 8 10, 23 1 12, 15 5 22, 7 9 null, 21 3 5, null 3 20, 16 2 15
4
1 3 6 10 15 21
I) 13 80 18, 18 71 null, 5 10 19, 12 1 8, 19 21 null, 31 6 2, 17 5 26, 26 0 30, 3 -1 25, null 1 23, 27 6 17, 14 1 24, 28 -1 3, null 80 0, 20 4 11, 33 6 29, 24 9 33, 10 7 6, 0 67 1, 2 15 4, 32 1 14, null 1 31, 29 3 null, 9 -1 28, 11 5 16, 8 1 null, 6 3 7, null 8 10, 23 1 12, 15 5 22, 7 9 null, 21 3 5, null 3 20, 16 2 15
14
3 1 4 1 5 9 2 6 5 3
J) 13 80 18, 18 71 null, 5 10 19, 12 1 8, 19 21 null, 31 6 2, 17 5 26, 26 0 30, 3 -1 25, null 1 23, 27 6 17, 14 1 24, 28 -1 3, null 80 0, 20 4 11, 33 6 29, 24 9 33, 10 7 6, 0 67 1, 2 15 4, 32 1 14, null 1 31, 29 3 null, 9 -1 28, 11 5 16, 8 1 null, 6 3 7, null 8 10, 23 1 12, 15 5 22, 7 9 null, 21 3 5, null 3 20, 16 2 15
17
8 6 7 5 3 0 9
K) 4 11 0, null 22 3, null 33 3, 1 44 4, 3 55 null, 7 66 7, 6 77 6
3
22 44 55
L) null -123 null
0
-123