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
quelle
Antworten:
05AB1E , 25 Bytes
Probieren Sie es online!
Erläuterung
quelle
Haskell ,
79655955 Bytes-6 Bytes dank Brute Force .
Definiert eine Funktion
#
, die eine Liste mit ganzen Zahlen akzeptiert, wobeinull
dargestellt wird als-1
und eine Liste mit Knotenwerten zurückgibt.Probieren Sie es online!
Erläuterung
Definieren Sie eine Funktion
!
, die die Knoten ab Knoten durchläufti
und eine Liste der besuchten Indizes zurückgibt. Es akzeptiert das zweite Argumentd
, das angibt, welcher Index des "Tupels" als Index des nächsten Knotens verwendet wird (d==2
vorwärtsd==0
iterieren, rückwärts iterieren).Ab dem angegebenen Index rückwärts iterieren und besuchte Indizes zurückgeben.
Nimm den zuletzt besuchten Index, der der Anfang der Liste ist.
Iterieren Sie ab dem Anfang der Liste.
Ersetzen Sie jeden besuchten Index durch den Wert des Knotens.
quelle
x!!i!!1
wiei!1!!1
, aber es bricht wegen-1
in den Ausgängen. Wenn Sie nur einen anderen Sentinel - Wert wählen zu repräsentierennull
(sagen-9
), wird es funktionieren, aber es wird immer für brechen einige Eingabe, was ziemlich ärgerlich.Python 2 , 60 Bytes
Probieren Sie es online!
Dies ist so ziemlich die Antwort von Chas Brown, abzüglich dieser Golfplätze:
quelle
Sauber ,
949088 BytesProbieren Sie es online!
quelle
MATL , 39 Bytes
Probieren Sie es online!
Fast ein direkter Port meiner Octave-Antwort, aber diese Version findet das Ende zuerst und arbeitet es dann wieder zurück und nicht umgekehrt, wodurch ein Byte gespart wurde.
quelle
PHP, 132 Bytes
Probieren Sie es online!
Die Eingabe wird als Querystring
x[]=-1&x[]=1&x[]=1...
(alle Knoten in einem flachen Array) in der Reihenfolgenext
,prev
und dannvalue
für jeden Knoten mit -1 zum Beenden von Knoten verwendet.quelle
Python 2 ,
8177 BytesProbieren Sie es online!
EDIT: Danke an Mr. Xcoder für 4 Bytes ...
Nimmt eine Liste von Tupeln [u, v, w], wobei u und w -1 sind, um den Anfang / das Ende des verknüpften Listensegments darzustellen.
quelle
0
Falsy ist und daheru>=0
golfed werden kann ,u+1
und dies kann weiter verkürzt werden ,-~u
die Leerzeichen zu entfernen.Oktave ,
817876 BytesProbieren Sie es online!
Eher unkomplizierte Version. Die Erklärung bleibt als Übung dem Leser überlassen. Eine viel spaßigere Version wird nachfolgend vorgestellt:
Oktave ,
1429992 BytesProbieren Sie es online!
Yo, ich habe gehört, du mochtest anonyme Funktionen ...
Nimmt ein
nx3
Array, wobei die erste Spalte der Vorgänger, die zweite Spalte der Wert und der dritte Wert die Nachfolgeknoten sind. Alle Knotenindizes basieren auf 1, was in Octave der Standard ist.quelle
Kotlin , 85 Bytes
Verschönert
Prüfung
TIO
TryItOnline
quelle
JavaScript ES6,
7063 BytesTestfall:
quelle
alert
muss sich im Hauptteil Ihrer Funktion befinden und auf Ihre Bytesumme angerechnet werden.