Двусвязный список - это структура данных, в которой каждый узел имеет 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
источник
Ответы:
05AB1E , 25 байтов
Попробуйте онлайн!
объяснение
источник
Haskell ,
79655955 байтов-6 байт благодаря грубой силе .
Определяет функцию,
#
которая принимает список списков целых чисел, гдеnull
представлен как-1
, и возвращает список значений узлов.Попробуйте онлайн!
объяснение
Определите функцию,
!
которая перебирает узлы, начиная с узла,i
и возвращает список посещенных индексов. Он принимает второй аргумент,d
который указывает, какой индекс «кортежа» использовать в качестве индекса следующего узла (d==2
для итерации вперед,d==0
для итерации назад).Итерация в обратном направлении, начиная с данного индекса, и возврат посещенных индексов.
Возьмите последний посещенный индекс, который является началом списка.
Итерировать с начала списка.
Замените каждый посещенный индекс значением узла.
источник
x!!i!!1
какi!1!!1
, но это ломается из-за-1
в выходных данных. Если вы просто выберете другое значение часового значения для представленияnull
(скажем,-9
), оно будет работать, но оно всегда будет прерываться для некоторого ввода, что довольно раздражает.Python 2 , 60 байт
Попробуйте онлайн!
Это в значительной степени ответ Часа Брауна, за исключением этих гольфов:
источник
Чисто ,
949088 байтПопробуйте онлайн!
источник
MATL , 39 байт
Попробуйте онлайн!
Почти прямой порт моего октавского ответа, но эта версия сначала находит конец, а затем работает наоборот, а не наоборот, что позволило сохранить один байт.
источник
PHP, 132 байта
Попробуйте онлайн!
Ввод берутся в качестве строки запроса
x[]=-1&x[]=1&x[]=1...
(все узлы в плоском массиве), в порядкеnext
,prev
, тоvalue
для каждого узла с -1 , используемым для прекращения узлов.источник
Python 2 ,
8177 байтПопробуйте онлайн!
РЕДАКТИРОВАТЬ: Спасибо мистеру Xcoder за 4 байта ...
Принимает список кортежей [u, v, w], где u и w равны -1, чтобы представить начало / конец сегмента связанного списка.
источник
0
Falsy, и поэтому ихu>=0
можно использовать для гольфа,u+1
и это можно еще сократить,-~u
чтобы удалить пробелы.Октава ,
817876 байтПопробуйте онлайн!
Скорее простая версия. Объяснение оставлено в качестве упражнения для читателя. Гораздо более интересная версия представлена ниже:
Октава ,
1429992 байтаПопробуйте онлайн!
Эй, я слышал, тебе понравились анонимные функции ...
Принимает
nx3
массив с первым столбцом предшественником, вторым столбцом значением и третьим значением узлов-преемников. Все индексы узлов основаны на 1, что является значением по умолчанию в Octave.источник
Котлин , 85 байт
украшенный
Тестовое задание
TIO
TryItOnline
источник
JavaScript ES6,
7063 байтаПрецедент:
источник
alert
потребности быть в основной части вашей функции и засчитаны ваш общий байт.