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
fuente
Respuestas:
05AB1E , 25 bytes
Pruébalo en línea!
Explicación
fuente
Haskell ,
79655955 bytes-6 bytes gracias a Brute Force .
Define la función
#
que acepta una lista de listas de enteros, dondenull
se representa como-1
, y devuelve una lista de valores de nodo.Pruébalo en línea!
Explicación
Defina la función
!
que itera a través de los nodos comenzando en el nodoi
y devuelve una lista de índices visitados. Acepta el segundo argumentod
que especifica qué índice de la "tupla" se usa como índice del siguiente nodo (d==2
iterar hacia adelante,d==0
iterar hacia atrás).Iterar hacia atrás a partir del índice dado y devolver los índices visitados.
Tome el último índice visitado, que es el comienzo de la lista.
Iterar desde el principio de la lista.
Reemplace cada índice visitado con el valor del nodo.
fuente
x!!i!!1
comoi!1!!1
, pero se rompe debido-1
a las salidas. Si solo elige otro valor centinela para representarnull
(digamos-9
), funcionará, pero siempre se interrumpirá para alguna entrada, lo cual es bastante molesto.Python 2 , 60 bytes
Pruébalo en línea!
Esta es la respuesta de Chas Brown, menos estos campos de golf:
fuente
Limpio ,
949088 bytesPruébalo en línea!
fuente
MATL , 39 bytes
Pruébalo en línea!
Casi un puerto directo de mi respuesta Octave, pero esta versión encuentra el final primero, y luego lo funciona al revés, en lugar de al revés, lo que ahorró un byte.
fuente
PHP, 132 bytes
Pruébalo en línea!
De entrada se toma como una cadena de consulta
x[]=-1&x[]=1&x[]=1...
(todos los nodos de una matriz plana), en el orden denext
,prev
y, a continuaciónvalue
para cada nodo con -1 utilizado para poner fin a los nodos.fuente
Python 2 ,
8177 bytesPruébalo en línea!
EDITAR: Thx al Sr. Xcoder por 4 bytes ...
Toma una lista de tuplas [u, v, w] donde u y w son -1 para representar el principio / final del segmento de la lista vinculada.
fuente
0
es Falsy y, poru>=0
lo tanto, se puede jugar golfu+1
y esto se puede acortar aún más-~u
para eliminar el espacio en blanco.Octava ,
817876 bytesPruébalo en línea!
Versión bastante sencilla. La explicación se deja como un ejercicio para el lector. A continuación se presenta una versión mucho más divertida :
Octava ,
1429992 bytesPruébalo en línea!
Oye, escuché que te gustaban las funciones anónimas ...
Toma una
nx3
matriz, con la primera columna el predecesor, la segunda columna el valor y el tercer valor los nodos sucesores. Todos los índices de nodo están basados en 1, que es el valor predeterminado en Octave.fuente
Kotlin , 85 bytes
Embellecido
Prueba
TIO
TryItOnline
fuente
JavaScript ES6,
7063 BytesCaso de prueba:
fuente
alert
necesidad de estar en el cuerpo principal de su función y contar para su total de bytes.