Un elenco doppiamente collegato è una struttura di dati in cui ciascun nodo ha value
sia "collegamenti" sia a quello previous
successivo nodes
nell'elenco. Ad esempio, considerare i seguenti nodi con valori 12, 99 e 37:
Qui, i nodi con valori 12 e 99 puntano ai rispettivi next
nodi, con valori 99 e 37 . Il nodo con valore 37 non ha next
puntatore perché è l'ultimo nodo nell'elenco. Allo stesso modo, i nodi con valori 99 e 37 puntano ai rispettivi previous
nodi, 12 e 99 , ma 12 non ha previous
puntatore perché è il primo nodo dell'elenco.
Il set up
In pratica, i "collegamenti" di un nodo sono implementati come puntatori alla posizione del nodo precedente e successivo in memoria. Per i nostri scopi, la "memoria" sarà una matrice di nodi e la posizione di un nodo sarà il suo indice nella matrice. Un nodo può essere pensato come una 3 tupla del modulo ( prev value next )
. L'esempio sopra, quindi, potrebbe assomigliare a questo:
Ma potrebbe apparire così, invece:
A partire da qualsiasi nodo, è possibile seguire i previous
collegamenti (mostrati come origini delle frecce rosse) per arrivare ai nodi che lo precedono e next
collegamenti (frecce verdi) per trovare i nodi successivi al fine di ottenere tutti i valori dei nodi in ordine: [12, 99, 37]
.
Il primo diagramma sopra potrebbe essere rappresentato in un array come [[null, 12, 1], [0, 99, 2], [1, 37, null]]
. Il secondo, quindi, sarebbe [[2, 99, 1], [0, 37, null], [null, 12, 0]]
.
La sfida
Scrivere un programma che accetta come input una matrice di nodi e l'indice di un nodo e restituisce, in ordine di lista, i valori dei nodi nella stessa lista doppiamente collegata.
Una complicazione
La "memoria" non conterrà sempre i nodi di un solo elenco. Potrebbe contenere diversi elenchi:
L'array sopra contiene tre elenchi doppiamente collegati, codificati a colori per comodità:
I nodi a indici
7
,10
,1
,4
,3
,12
(mostrando solonext
i collegamenti per ridurre l'ingombro, clicca per ingrandire):Dato questo array e uno qualsiasi di questi indici, il programma dovrebbe restituire, nell'ordine, i valori
[0, 1, 1, 2, 3, 5, 8]
.Il nodo all'indice
9
:Dato l'indice
9
, il tuo programma dovrebbe tornare[99]
.I nodi a indici
11
,8
,0
,6
,2
:Dato uno di questi indici, dovrebbe tornare
[2, 3, 5, 7, 11]
.
Regole
Ingresso
Il tuo programma riceverà come input:
Un elenco di nodi ((3-tuple come descritto sopra), dove 1 ≤ 𝒏 ≤ 1.000, in qualsiasi formato conveniente, ad esempio una matrice di matrici, una matrice "piatta" di numeri interi con lunghezza 3𝒏, ecc.
Elementi 3-tuple possono essere in qualsiasi ordine:
( prev value next )
,( next prev value )
, ecc Per ogni nodo,prev
enext
sarannonull
(o un altro valore conveniente, per esempio-1
), che indica il primo o l'ultimo nodo in una lista doppiamente concatenata, o un indice valido del elenco, basato su 0 o 1 come è conveniente.value
sarà un numero intero a 32 bit con segno o il tipo intero più grande supportato dalla tua lingua, a seconda di quale sia il più piccolo.L'indice 𝒑 di un nodo nell'elenco (1). Il nodo indicato può essere il primo nodo in un elenco doppiamente collegato, l'ultimo nodo, un nodo centrale o persino l'unico nodo.
L'elenco di input (1) può contenere dati patologici (ad es. Cicli, nodi indicati da più altri nodi, ecc.), Ma l'indice di input (2) punterà sempre a un nodo dal quale può essere un singolo output ben formato dedotta.
Produzione
Il programma dovrebbe generare i valori dei nodi dell'elenco doppiamente collegato di cui è membro il nodo all'indice 𝒑, in ordine di lista. L'output può essere in qualsiasi formato conveniente, ma i suoi dati devono includere solo i nodi value
.
vincente
Questo è code-golf . Vince la risposta più breve in byte. Si applicano scappatoie standard.
Casi test
Di seguito, ciascun caso di test è nel formato:
X)
prev value next, prev value next, ...
index
value value value ...
... dove X
c'è una lettera per identificare il caso di test, la seconda riga è l'elenco di input, la terza riga è l'indice di input basato su 0 e la quarta riga è l'output.
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