Двусвязный список - это структура данных, в которой каждый узел имеет value
как «ссылки», так previous
и следующий nodes
в списке. Например, рассмотрим следующие узлы со значениями 12, 99 и 37:
Здесь узлы со значениями 12 и 99 указывают на их соответствующие next
узлы со значениями 99 и 37 . Узел со значением 37 не имеет next
указателя, потому что это последний узел в списке. Аналогично, узлы со значениями 99 и 37 указывают на их соответствующие previous
узлы, 12 и 99 , но у 12 нет previous
указателя, потому что это первый узел в списке.
Настройка
На практике «ссылки» узла реализуются как указатели на расположение предыдущего и следующего узла в памяти. Для наших целей «память» будет массивом узлов, а местоположение узла будет его индексом в массиве. Узел может рассматриваться как три кортежа формы ( 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