Une liste doublement liée est une structure de données dans laquelle chaque nœud a un value
ainsi que des «liens» à la fois au previous
et suivant nodes
dans la liste. Par exemple, considérez les nœuds suivants avec les valeurs 12, 99 et 37:
Ici, les nœuds avec les valeurs 12 et 99 pointent vers leurs next
nœuds respectifs , avec les valeurs 99 et 37 . Le nœud avec la valeur 37 n'a pas de next
pointeur car c'est le dernier nœud de la liste. De même, les nœuds avec les valeurs 99 et 37 pointent vers leurs previous
nœuds respectifs , 12 et 99 , mais 12 n'a pas de previous
pointeur car c'est le premier nœud de la liste.
La mise en place
En pratique, les "liens" d'un nœud sont implémentés en tant que pointeurs vers les emplacements du nœud précédent et suivant en mémoire. Pour nos besoins, la "mémoire" sera un tableau de nœuds et l'emplacement d'un nœud sera son index dans le tableau. Un nœud peut être considéré comme un triplet de la forme ( prev value next )
. L'exemple ci-dessus pourrait alors ressembler à ceci:
Mais cela pourrait plutôt ressembler à ceci:
À partir de n'importe quel nœud, vous pouvez suivre les previous
liens (indiqués comme les origines des flèches rouges) pour accéder aux nœuds qui le précèdent et les next
liens (flèches vertes) pour trouver les nœuds suivants afin d'obtenir toutes les valeurs des nœuds dans l'ordre: [12, 99, 37]
.
Le premier diagramme ci-dessus pourrait être représenté dans un tableau sous la forme [[null, 12, 1], [0, 99, 2], [1, 37, null]]
. Le second serait donc [[2, 99, 1], [0, 37, null], [null, 12, 0]]
.
Le défi
Écrivez un programme qui prend en entrée un tableau de nœuds et l'index d'un nœud et renvoie, dans l'ordre des listes, les valeurs des nœuds dans la même liste doublement liée.
Une complication
La "mémoire" ne contiendra pas toujours les nœuds d'une seule liste. Il peut contenir plusieurs listes:
Le tableau ci-dessus contient trois listes doublement liées, codées par couleur pour votre commodité:
Les noeuds à index
7
,10
,1
,4
,3
,12
(ne montrant que desnext
liens pour réduire l' encombrement, cliquez pour agrandir):Étant donné ce tableau et l'un de ces index, votre programme doit retourner, dans l'ordre, les valeurs
[0, 1, 1, 2, 3, 5, 8]
.Le nœud à l'index
9
:Compte tenu de l'index
9
, votre programme devrait revenir[99]
.Les noeuds à index
11
,8
,0
,6
,2
:Étant donné l'un de ces index, il devrait revenir
[2, 3, 5, 7, 11]
.
Règles
Contribution
Votre programme recevra en entrée:
Une liste de 𝒏 nœuds (3-tuples comme décrit ci-dessus), où 1 ≤ 𝒏 ≤ 1000, dans n'importe quel format pratique, par exemple un tableau de tableaux, un tableau "plat" d'entiers de longueur 3𝒏, etc.
Les éléments de 3-uplets peuvent être dans un ordre quelconque:
( prev value next )
,( next prev value )
, etc. Pour chaque noeud,prev
etnext
seranull
(ou une autre valeur appropriée, par exemple-1
), ce qui indique le premier ou le dernier noeud dans une liste doublement lié, ou un indice valide de la liste, soit 0 ou 1 comme il est commode.value
sera un entier 32 bits signé ou le plus grand type d'entier pris en charge par votre langue, le plus petit des deux.L'index 𝒑 d'un nœud dans la liste (1). Le nœud indiqué peut être le premier nœud d'une liste à double liaison, le dernier nœud, un nœud intermédiaire ou même le seul nœud.
La liste d'entrée (1) peut contenir des données pathologiques (par exemple des cycles, des nœuds pointés par plusieurs autres nœuds, etc.), mais l'index d'entrée (2) pointera toujours vers un nœud à partir duquel une sortie unique et bien formée peut être déduit.
Production
Votre programme devrait sortir les valeurs des nœuds de la liste doublement liée dont le nœud à l'index 𝒑 est membre, dans l'ordre des listes. La sortie peut être dans n'importe quel format pratique, mais ses données doivent inclure uniquement les nœuds value
.
Gagnant
C'est du code-golf . La réponse la plus courte en octets l'emporte. Des échappatoires standard s'appliquent.
Cas de test
Ci-dessous, chaque cas de test est de la forme:
X)
prev value next, prev value next, ...
index
value value value ...
... où X
est une lettre pour identifier le cas de test, la deuxième ligne est la liste d'entrée, la troisième ligne est l'index d'entrée basé sur 0 et la quatrième ligne est la sortie.
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