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
fonte
Respostas:
05AB1E , 25 bytes
Experimente online!
Explicação
fonte
Haskell ,
79655955 bytes-6 bytes graças ao Brute Force .
Define a função
#
que aceita uma lista de listas de números inteiros, ondenull
é representado como-1
, e retorna a lista de valores de nós.Experimente online!
Explicação
Defina a função
!
que itera pelos nós começando no nói
e retorna uma lista de índices visitados. Ele aceita o segundo argumentod
que especifica qual índice da "tupla" usa como índice do próximo nó (d==2
para iterar para frente,d==0
para iterar para trás).Itere de trás para frente a partir do índice fornecido e retorne os índices visitados.
Tome o último índice visitado, que é o início da lista.
Iterar a partir do início da lista.
Substitua cada índice visitado pelo valor do nó.
fonte
x!!i!!1
comoi!1!!1
, mas ele quebra por causa das-1
saídas. Se você escolher outro valor sentinela para representarnull
(digamos-9
), ele funcionará, mas sempre será interrompido por alguma entrada, o que é bastante irritante.Python 2 , 60 bytes
Experimente online!
Esta é praticamente a resposta de Chas Brown, menos estes campos:
fonte
Limpo ,
949088 bytesExperimente online!
fonte
MATL , 39 bytes
Experimente online!
Quase uma porta direta da minha resposta do Oitava, mas esta versão encontra o fim primeiro e depois trabalha de volta, e não o contrário, que salvou um byte.
fonte
PHP, 132 bytes
Experimente online!
A entrada é tomada como uma string de consulta
x[]=-1&x[]=1&x[]=1...
(todos os nós em uma matriz plana), na ordem denext
,prev
e depoisvalue
para cada nó com -1 usado para terminar os nós.fonte
Python 2 ,
8177 bytesExperimente online!
EDIT: Thx para o Sr. Xcoder por 4 bytes ...
Toma uma lista de tuplas [u, v, w] onde u e w são -1 para representar o início / fim do segmento da lista vinculada.
fonte
0
Falsy é, e, portanto,u>=0
pode ser jogado no golfeu+1
e isso pode ser ainda mais reduzido-~u
para remover o espaço em branco.Oitava ,
817876 bytesExperimente online!
Versão bastante simples. A explicação é deixada como um exercício para o leitor. Uma versão muito mais divertida é apresentada abaixo:
Oitava ,
1429992 bytesExperimente online!
Ouvi dizer que você gostava de funções anônimas ...
Obtém uma
nx3
matriz, com a primeira coluna o predecessor, a segunda coluna o valor e o terceiro valor os nós sucessores. Todos os índices do nó são baseados em 1, que é o padrão no Octave.fonte
Kotlin , 85 bytes
Embelezado
Teste
TIO
TryItOnline
fonte
JavaScript ES6,
7063 bytesCaso de teste:
fonte
alert
necessidades devem estar no corpo principal da sua função e contadas para o total de bytes.