Подвійно зв'язаний список - це структура даних, в якій кожен вузол має value
а також "посилання" на список previous
і наступний nodes
у списку. Наприклад, розглянемо наступні вузли зі значеннями 12, 99 та 37:
Тут вузли зі значеннями 12 і 99 вказують на їх відповідні next
вузли зі значеннями 99 і 37 . У вузла зі значенням 37 немає next
вказівника, оскільки це останній вузол у списку. Аналогічно, вузли зі значеннями 99 і 37 вказують на їх відповідні previous
вузли, 12 і 99 , але 12 не має previous
вказівника, оскільки це перший вузол у списку.
Установка
На практиці "посилання" вузла реалізуються як покажчики на місця попереднього та наступного вузлів у пам'яті. Для наших цілей "пам'ять" буде масивом вузлів, а розташування вузла - його індексом у масиві. Вузол можна розглядати як 3-красну форму форми ( prev value next )
. Наведений вище приклад може виглядати приблизно так:
Але це може виглядати приблизно так:
Починаючи з будь-якого вузла, ви можете previous
переходити до посилань (показаних як джерела червоних стрілок), щоб дістатися до вузлів, які передують йому, та next
посилань (зелених стрілок), щоб знайти наступні вузли, щоб отримати всі значення вузлів у порядку: [12, 99, 37]
.
Перша діаграма вище може бути представлена у масиві як [[null, 12, 1], [0, 99, 2], [1, 37, null]]
. Другий, значить, був би [[2, 99, 1], [0, 37, null], [null, 12, 0]]
.
Змагання
Напишіть програму, яка приймає як вхід масив вузлів та індекс вузла та повертає у порядку списку значення вузлів у тому ж подвійному зв’язку списку.
Ускладнення
"Пам'ять" не завжди містить вузли лише одного списку. Він може містити кілька списків:
Наведений вище масив містить три подвійно пов'язані списки, кольорово кодовані для вашої зручності:
Вузли в індексах
7
,10
,1
,4
,3
,12
(показані тількиnext
посилання , щоб зменшити перешкоди, натисніть , щоб збільшити):Враховуючи цей масив і будь-який з цих індексів, ваша програма повинна повертати значення для того, щоб вони були
[0, 1, 1, 2, 3, 5, 8]
.Вузол в індексі
9
:Враховуючи індекс
9
, ваша програма повинна повернутися[99]
.Вузли на індекси
11
,8
,0
,6
,2
:Враховуючи один з цих показників, він повинен повернутися
[2, 3, 5, 7, 11]
.
Правила
Вхідні дані
Ваша програма отримає як вхід:
Список 𝒏 вузлів (3-кортежі, як описано вище), де 1 ≤ 𝒏 ≤ 1000, у будь-якому зручному форматі, наприклад, масив масивів, "плоский" масив цілих чисел довжиною 3𝒏 тощо.
Елементи 3-кортежів можуть бути в будь-якому порядку:,
( prev value next )
і( next prev value )
т. Д. Для кожного вузлаprev
іnext
будеnull
(або інше зручне значення, наприклад-1
), що вказує на перший або останній вузол у подвійному зв’язку списку або на дійсний індекс список на основі 0 або 1, як зручно.value
буде 32-розрядним цілим числом, який підписує, або найбільшим цілим типом, який підтримує ваша мова, залежно від того, яка є менша кількість.Індекс 𝒑 вузла у списку (1). Вказаний вузол може бути першим вузлом у подвійно зв'язаному списку, останнім вузлом, середнім вузлом або навіть єдиним вузлом.
Список вхідних даних (1) може містити патологічні дані (наприклад, цикли, вузли, на які вказують кілька інших вузлів тощо), але вхідний індекс (2) завжди вказуватиме на вузол, з якого може бути єдиний, добре сформований вихід. виведено.
Вихідні дані
Ваша програма повинна виводити значення вузлів подвійно пов'язаного списку, членом якого є вузол в індексі 𝒑, у порядку списку. Вихід може бути у будь-якому зручному форматі, але його дані повинні містити лише вузол value
s.
Перемога
Це код-гольф . Найкоротша відповідь у байтах виграє. Застосовуються стандартні лазівки.
Тестові справи
Нижче кожен тестовий випадок має форму:
X)
prev value next, prev value next, ...
index
value value value ...
... де X
літера для ідентифікації тестового випадку, другий рядок - список введення, третій рядок - вхідний індекс на основі 0, а четвертий - вихідний.
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