Podwójnie połączona lista to struktura danych, w której każdy węzeł ma value
zarówno „łącza” do obu, jak previous
i następnego nodes
na liście. Rozważmy na przykład następujące węzły o wartościach 12, 99 i 37:
Tutaj węzły o wartościach 12 i 99 wskazują ich odpowiednie next
węzły o wartościach 99 i 37 . Węzeł o wartości 37 nie ma next
wskaźnika, ponieważ jest ostatnim węzłem na liście. Podobnie, węzły o wartościach 99 i 37 wskazują ich odpowiednie previous
węzły, 12 i 99 , ale 12 nie ma previous
wskaźnika, ponieważ jest to pierwszy węzeł na liście.
Ustawić
W praktyce „łącza” węzła są implementowane jako wskaźniki do lokalizacji poprzedniego i następnego węzła w pamięci. Dla naszych celów „pamięć” będzie tablicą węzłów, a lokalizacja węzła będzie jej indeksem w tablicy. Węzeł może być traktowany jako 3-krotna forma ( prev value next )
. Powyższy przykład może wyglądać następująco:
Zamiast tego może to wyglądać tak:
Zaczynając od dowolnego węzła, możesz podążać za previous
linkami (pokazanymi jako pochodzenie czerwonych strzałek), aby dostać się do poprzedzających go węzłów i next
linkami (zielonymi strzałkami), aby znaleźć kolejne węzły, aby uzyskać wszystkie wartości węzłów w kolejności: [12, 99, 37]
.
Pierwszy diagram powyżej może być reprezentowany w tablicy jako [[null, 12, 1], [0, 99, 2], [1, 37, null]]
. Drugi więc byłby [[2, 99, 1], [0, 37, null], [null, 12, 0]]
.
Wyzwanie
Napisz program, który pobiera jako dane wejściowe tablicę węzłów i indeks węzła i zwraca, w kolejności listowej, wartości węzłów na tej samej podwójnie połączonej liście.
Komplikacja
„Pamięć” nie zawsze zawiera węzły tylko jednej listy. Może zawierać kilka list:
Powyższa tablica zawiera trzy podwójnie połączone listy, oznaczone kolorami dla Twojej wygody:
Węzły w indeksach
7
,10
,1
,4
,3
,12
(widocznych jedynienext
odnośniki do zmniejszenia bałaganu; kliknij, aby powiększyć):Biorąc pod uwagę tę tablicę i dowolny z tych indeksów, Twój program powinien zwracać wartości w odpowiedniej kolejności
[0, 1, 1, 2, 3, 5, 8]
.Węzeł o indeksie
9
:Biorąc pod uwagę indeks
9
, twój program powinien powrócić[99]
.Węzły w indeksach
11
,8
,0
,6
,2
:Biorąc pod uwagę jeden z tych indeksów, powinien on zwrócić
[2, 3, 5, 7, 11]
.
Zasady
Wejście
Twój program otrzyma jako dane wejściowe:
Lista odes węzłów (3 krotki jak opisano powyżej), gdzie 1 ≤ 𝒏 ≤ 1000, w dowolnym dogodnym formacie, np. Tablica tablic, „płaska” tablica liczb całkowitych o długości 3𝒏 itd.
Elementy 3-krotki może znajdować się w dowolnej kolejności:
( prev value next )
,( next prev value )
, itd. Dla każdego węzła,prev
inext
będzienull
(lub inną dogodną wartością, na przykład-1
), wskazując na pierwszy lub ostatni węzeł podwójnie połączonej listy lub ważny indeks lista, oparta na 0 lub 1, co jest wygodne.value
będzie 32-bitową liczbą całkowitą ze znakiem lub największą liczbą całkowitą obsługiwaną przez Twój język, w zależności od tego, która wartość jest mniejsza.Indeks 𝒑 węzła na liście (1). Wskazany węzeł może być pierwszym węzłem na podwójnie połączonej liście, ostatnim, środkowym lub nawet jedynym.
Lista wejściowa (1) może zawierać dane patologiczne (np. Cykle, węzły wskazywane przez wiele innych węzłów itp.), Ale indeks wejściowy (2) zawsze będzie wskazywał węzeł, z którego można uzyskać pojedyncze, dobrze uformowane wyjście wydedukować.
Wynik
Twój program powinien wyświetlać wartości węzłów podwójnie połączonej listy, której członkiem jest węzeł o indeksie 𝒑, w kolejności list. Dane wyjściowe mogą być w dowolnym dogodnym formacie, ale dane muszą zawierać tylko węzły value
.
Zwycięski
To jest golf golfowy . Najkrótsza odpowiedź w bajtach wygrywa. Obowiązują standardowe luki.
Przypadki testowe
Poniżej każdy przypadek testowy ma postać:
X)
prev value next, prev value next, ...
index
value value value ...
... gdzie X
jest litera identyfikująca przypadek testowy, drugi wiersz to lista wejściowa, trzeci wiersz to indeks wejściowy oparty na 0, a czwarty wiersz to wynik.
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
źródło
Odpowiedzi:
05AB1E , 25 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Haskell ,
79655955 bajtów-6 bajtów dzięki Brute Force .
Definiuje funkcję,
#
która akceptuje listę list liczb całkowitych, gdzienull
jest reprezentowana jako-1
, i zwraca listę wartości węzłów.Wypróbuj online!
Wyjaśnienie
Zdefiniuj funkcję,
!
która iteruje przez węzły zaczynające się od węzłai
i zwraca indeksy odwiedzonych list. Akceptuje drugi argument,d
który określa, który indeks „krotki” ma być używany jako indeks następnego węzła (d==2
do iteracji do przodu,d==0
do iteracji do tyłu).Iteruj wstecz, zaczynając od podanego indeksu i zwracaj odwiedzone indeksy.
Weź ostatnio odwiedzony indeks, który jest początkiem listy.
Iteruj od początku listy.
Zamień każdy odwiedzony indeks na wartość węzła.
źródło
x!!i!!1
jakoi!1!!1
, ale psuje się z powodu danych-1
wyjściowych. Jeśli wybierzesz inną wartość wartownika do reprezentowanianull
(powiedzmy,-9
), zadziała, ale zawsze ulegnie awarii w przypadku niektórych danych wejściowych, co jest dość denerwujące.Python 2 , 60 bajtów
Wypróbuj online!
To właściwie odpowiedź Chasa Browna, pomijając te golfa:
źródło
Czysty ,
949088 bajtówWypróbuj online!
źródło
MATL , 39 bajtów
Wypróbuj online!
Prawie bezpośredni port mojej odpowiedzi Octave, ale ta wersja najpierw znajduje koniec, a następnie działa w przeszłość, a nie na odwrót, co pozwoliło zaoszczędzić jeden bajt.
źródło
PHP, 132 bajty
Wypróbuj online!
Wejście jest traktowana jako kwerendy
x[]=-1&x[]=1&x[]=1...
(wszystkie węzły w płaskiej matrycy), w kolejnościnext
,prev
, po czymvalue
dla każdego węzła, z -1 używany do zakończenia węzłów.źródło
Python 2 ,
8177 bajtówWypróbuj online!
EDYCJA: Dziękuję Panu Xcoder za 4 bajty ...
Pobiera listę krotek [u, v, w], gdzie u i w oznaczają -1, aby reprezentować początek / koniec połączonego segmentu listy.
źródło
0
Falsy, dlategou>=0
można grać w golfa,u+1
a to można dodatkowo skrócić,-~u
aby usunąć białe znaki.Oktawa ,
817876 bajtówWypróbuj online!
Raczej prosta wersja. Wyjaśnienie pozostawia się czytelnikowi jako ćwiczenie. O wiele bardziej zabawna wersja jest przedstawiona poniżej:
Oktawa ,
1429992 bajtyWypróbuj online!
Słyszałem, że lubisz anonimowe funkcje ...
Pobiera
nx3
tablicę, w której pierwsza kolumna jest poprzednikiem, druga kolumna wartością, a trzecią wartością węzły następcze. Wszystkie indeksy węzłów są oparte na 1, co jest wartością domyślną w Octave.źródło
Kotlin , 85 bajtów
Upiększony
Test
TIO
TryItOnline
źródło
JavaScript ES6,
7063 bajtówPrzypadek testowy:
źródło
alert
musi być w głównej części swojej funkcji i wliczane do całkowitego bajtów.