Eine doppelt verknüpfte Liste ist eine Datenstruktur, in der jeder Knoten sowohl eine value
als auch "Verknüpfungen" zu der previous
und der nächsten nodes
in der Liste aufweist. Betrachten Sie beispielsweise die folgenden Knoten mit den Werten 12, 99 und 37:
Hier zeigen die Knoten mit den Werten 12 und 99 auf ihre jeweiligen next
Knoten mit den Werten 99 und 37 . Der Knoten mit dem Wert 37 hat keinen next
Zeiger, da er der letzte Knoten in der Liste ist. Ebenso zeigen die Knoten mit den Werten 99 und 37 auf ihre jeweiligen previous
Knoten 12 und 99 , aber 12 hat keinen previous
Zeiger, da es der erste Knoten in der Liste ist.
Die Einrichtung
In der Praxis werden die "Links" eines Knotens als Zeiger auf die Positionen des vorherigen und des nächsten Knotens im Speicher implementiert. Für unsere Zwecke ist der "Speicher" ein Array von Knoten und der Ort eines Knotens ist sein Index im Array. Ein Knoten kann als 3-Tupel der Form betrachtet werden ( prev value next )
. Das obige Beispiel könnte dann so aussehen:
Aber es könnte stattdessen so aussehen:
Sie können von jedem Knoten aus über previous
Links (angezeigt als Ursprung der roten Pfeile) zu den vorhergehenden Knoten und über next
Links (grüne Pfeile) nach nachfolgenden Knoten suchen, um alle Werte der Knoten in der angegebenen Reihenfolge abzurufen: [12, 99, 37]
.
Das erste Diagramm oben könnte in einem Array als dargestellt werden [[null, 12, 1], [0, 99, 2], [1, 37, null]]
. Der zweite wäre dann [[2, 99, 1], [0, 37, null], [null, 12, 0]]
.
Die Herausforderung
Schreiben Sie ein Programm, das ein Array von Knoten und den Index eines Knotens als Eingabe verwendet und in Listenreihenfolge die Werte der Knoten in derselben doppelt verknüpften Liste zurückgibt.
Eine Komplikation
Der "Speicher" enthält nicht immer die Knoten von nur einer Liste. Es kann mehrere Listen enthalten:
Das obige Array enthält drei doppelt verknüpfte Listen, die der Einfachheit halber farblich gekennzeichnet sind:
Die Knoten auf Indizes
7
,10
,1
,4
,3
,12
(zeigt nurnext
Links Unordnung zu verringern; zum Vergrößern anklicken):Angesichts dieses Arrays und eines dieser Indizes sollte Ihr Programm die Werte in der angegebenen Reihenfolge zurückgeben
[0, 1, 1, 2, 3, 5, 8]
.Der Knoten am Index
9
:In Anbetracht des Index
9
sollte Ihr Programm zurückkehren[99]
.Die Knoten auf Indizes
11
,8
,0
,6
,2
:Bei einem dieser Indizes sollte er zurückgeben
[2, 3, 5, 7, 11]
.
Regeln
Eingang
Ihr Programm wird als Eingabe erhalten:
Eine Liste von 𝒏 Knoten (3-Tupel wie oben beschrieben) mit 1 ≤ 𝒏 ≤ 1.000 in einem beliebigen geeigneten Format, z. B. einem Array von Arrays, einem "flachen" Array von Ganzzahlen mit der Länge 3𝒏 usw.
Die 3-Tupel Elemente in beliebiger Reihenfolge sein:
( prev value next )
,( next prev value )
usw. Für jeden Knoten,prev
undnext
werdennull
(oder ein anderer geeigneter Wert, beispielsweise-1
), die den ersten oder letzten Knoten in einer doppelt verknüpften Liste oder einen gültigen Index der Liste, wahlweise 0- oder 1-basiert.value
Dies ist eine 32-Bit-Ganzzahl mit Vorzeichen oder der größte Ganzzahltyp, den Ihre Sprache unterstützt, je nachdem, welcher Wert kleiner ist.Der Index 𝒑 eines Knotens in der Liste (1). Der angegebene Knoten kann der erste Knoten in einer doppelt verknüpften Liste, der letzte Knoten, ein mittlerer Knoten oder sogar der einzige Knoten sein.
Die Eingabeliste (1) kann pathologische Daten enthalten (z. B. Zyklen, Knoten, auf die von mehreren anderen Knoten verwiesen wird usw.), der Eingabeindex (2) zeigt jedoch immer auf einen Knoten, von dem aus eine einzige, wohlgeformte Ausgabe erfolgen kann abgeleitet.
Ausgabe
Ihr Programm sollte die Werte der Knoten der doppelt verknüpften Liste, zu der der Knoten bei Index 𝒑 gehört, in Listenreihenfolge ausgeben. Die Ausgabe kann in einem beliebigen Format erfolgen, die Daten dürfen jedoch nur die Knoten enthalten value
.
Gewinnen
Das ist Code-Golf . Kürzeste Antwort in Bytes gewinnt. Es gelten Standardlücken.
Testfälle
Im Folgenden hat jeder Testfall die Form:
X)
prev value next, prev value next, ...
index
value value value ...
... wobei X
ein Buchstabe den Testfall kennzeichnet, die zweite Zeile die Eingabeliste ist, die dritte Zeile den 0-basierten Eingabeindex und die vierte Zeile die Ausgabe ist.
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