Uma lista duplamente vinculada é uma estrutura de dados na qual cada nó tem um value
"link" previous
e o "próximo" nodes
na lista. Por exemplo, considere os seguintes nós com os valores 12, 99 e 37:
Aqui, os nós com valores 12 e 99 apontam para seus respectivos next
nós, com valores 99 e 37 . O nó com o valor 37 não tem next
ponteiro porque é o último nó da lista. Da mesma forma, os nós com os valores 99 e 37 apontam para seus respectivos previous
nós, 12 e 99 , mas 12 não tem previous
ponteiro porque é o primeiro nó na lista.
A configuração
Na prática, os "links" de um nó são implementados como ponteiros para os locais do nó anterior e do próximo na memória. Para nossos propósitos, a "memória" será uma matriz de nós e a localização de um nó será o seu índice na matriz. Um nó pode ser pensado como uma 3-tupla do formulário ( prev value next )
. O exemplo acima, então, pode ser assim:
Mas pode parecer assim:
Começando em qualquer nó, você pode seguir os previous
links (mostrados como as origens das setas vermelhas) para chegar aos nós que o precedem e os next
links (setas verdes) para encontrar os nós subsequentes para obter todos os valores dos nós em ordem: [12, 99, 37]
.
O primeiro diagrama acima pode ser representado em uma matriz como [[null, 12, 1], [0, 99, 2], [1, 37, null]]
. O segundo, então, seria [[2, 99, 1], [0, 37, null], [null, 12, 0]]
.
O desafio
Escreva um programa que tome como entrada uma matriz de nós e o índice de um nó e retorne, em ordem de lista, os valores dos nós na mesma lista duplamente vinculada.
Uma complicação
A "memória" nem sempre conterá os nós de apenas uma lista. Pode conter várias listas:
A matriz acima contém três listas duplamente vinculadas, codificadas por cores para sua conveniência:
Os nós em índices
7
,10
,1
,4
,3
,12
(mostrando apenasnext
links para reduzir a desordem; clique para ampliar):Dada essa matriz e qualquer um desses índices, seu programa deve retornar, em ordem, os valores
[0, 1, 1, 2, 3, 5, 8]
.O nó no índice
9
:Dado o índice
9
, seu programa deve retornar[99]
.Os nós no índices
11
,8
,0
,6
,2
:Dado um desses índices, ele deve retornar
[2, 3, 5, 7, 11]
.
Regras
Entrada
Seu programa receberá como entrada:
Uma lista de nós (3 tuplas, conforme descrito acima), em que 1 ≤ 𝒏 ≤ 1.000, em qualquer formato conveniente, por exemplo, uma matriz de matrizes, uma matriz "plana" de números inteiros com comprimento 3𝒏, etc.
Os elementos de 3-tuplos podem estar em qualquer ordem:
( prev value next )
,( next prev value )
, etc. Para cada nó,prev
enext
vai sernull
(ou outro valor conveniente, por exemplo-1
), indicando o primeiro ou o último nó numa lista duplamente ligado, ou um índice válido do lista, com base em 0 ou 1, conforme for conveniente.value
será um número inteiro de 32 bits assinado ou o maior número inteiro compatível com o seu idioma, o que for menor.O índice 𝒑 de um nó na lista (1). O nó indicado pode ser o primeiro nó de uma lista duplamente vinculada, o último nó, um nó do meio ou mesmo o único nó.
A lista de entrada (1) pode conter dados patológicos (por exemplo, ciclos, nós apontados por vários outros nós etc.), mas o índice de entrada (2) sempre apontará para um nó a partir do qual uma saída única e bem formada pode ser deduzido.
Resultado
Seu programa deve gerar os valores dos nós da lista duplamente vinculada da qual o nó no índice 𝒑 é membro, em ordem de lista. A saída pode estar em qualquer formato conveniente, mas seus dados devem incluir apenas os nós value
.
Ganhando
Isso é código-golfe . A resposta mais curta em bytes vence. Aplicam-se brechas padrão.
Casos de teste
Abaixo, cada caso de teste tem o formato:
X)
prev value next, prev value next, ...
index
value value value ...
... onde X
está uma letra para identificar o caso de teste, a segunda linha é a lista de entrada, a terceira linha é o índice de entrada baseado em 0 e a quarta linha é a saída.
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