Berkus
Что это такое
есть двусвязный список с дополнительным указателем, который ссылается на любой произвольный узел в дереве
Ivan
В смысле на произвольный?
Berkus
нужно сделать дубликат этого списка, чтобы в новом списке этот указатель указывал на такие же ноды но в новой копии, за O(1) памяти кажется
Крылатый
Ivan
Это эзотерическая структура данных?
Berkus
Зачем?
это задачка со специальной олимпиады, что значит ЗАЧЕМ
Evgenii
Крылатый
Ivan
Ничего не понял, нарисуй со связями первоначальный трёх связный список?
Berkus
за O(N) по-моему делается, там надо два или три прохода по списку
Ivan
Как это выглядит?
Andrew
Berkus
у меня где-то есть картинка, но я ща на лепру доступа не имею, а где ее на диске искать хз )
Evgenii
Andrew
а, понел
Matwey
Я канонического решения не знаю, но на мой взгляд тут нужно догадаться вспомнить, что из односвязного списка можно восстановить двухсвязный
Berkus
там насколько я понял из своего решения, надо строить interweaved list
Matwey
И тогда одно из полей можно попользовать как отображение
Berkus
типа node1->next указывает на ноду из второго списка, а она указывает на ноду из первого, а та снова на ноду из второго
Berkus
тогда они получается идут парами
Berkus
ну и короче сначала второй список впендюриваешь промеж элементов первого, второй проход поправляет указатели на третью ноду и потом третий проход разделяет списки обратно на два
Berkus
все без доп памяти
Andrew
ну вообще, можно считерить — прономеровать ноды ))
Andrew
и тогда за O(N) можно скопировать
Berkus
по условиям задачи читерить нельзя *shrug*
Andrew
тогда при копировании сделать массив с номерами и указателями
Anatoly
массив нельзя
Matwey
там насколько я понял из своего решения, надо строить interweaved list
А я по другому придумал. Первый проход в прямом направлении, для каждого элемента создается элемент нового списка, как при простом копировании. Обратную связь старого списка мы ломаем и пишем туда указатель на элемент из нового списка который "соответсвует" старому. Третий указатель копируем временно as-is.
Evgenii
копируем ноды пока не доходим до ноды на которую указывает текущая?
Berkus
Andrew
да, не будет
Berkus
Berkus
из N1.1<->N1.2->N1.3 получаю N1.1<->N2.1<->N1.2<->N2.2<->N1.3<->N2.3
Andrew
вот изврат ))
Andrew
но забавно
Ivan
👍
Andrew
это мне напоминает вопрос: как в С передать строку ПО ЗНАЧЕНИЮ ))
Andrew
а не по указателю
Aidar
strcpy
Ivan
Мне вообще не нравится это словосочетание "по значению". Я предлагаю говорить копированием.
Andrew
strcpy
забыл уточнить, что передавать надо в функцию
Ivan
Раньше я путал с передачей по ссылке. Для меня это было одно и тоже.
Ivan
Что такое "значение"?
Andrew
так вот ответ был такой: положить строку в структуру и её передать ))
Aidar
и чо будет?
Aidar
яннп
Andrew
Berkus
Andrew
и чо будет?
будет решение синтетической задачи )
Berkus
в структуре сама строка, массивом
Ivan
Смотря как ее положить
Aidar
Berkus
struct S { char string_here[100]; }
Ivan
Ну так да
Aidar
по значению это устоявшийся термин
Ivan
Он устарел
Aidar
чем
Ivan
Он не отражает суть сего действа
Ivan
Когда вы передаёте int и const int&, то нет разницы по количеству копирования. Но это смущает молодые умы и они всё копируют! Термин "По значению" не отражает суть
Ivan
В смысле для примитивных типов нет разницы
Berkus
Matway
Он бессмысленный - это правда. Спорил на собеседовании - это зря.
Крылатый
Лучше просто const int передавать.
Ivan
Berkus
ну мы все сойдемся во мнении что интервьюер бессмысленный, я думаю
Крылатый
А ещё лучше int&&!
Ivan
Berkus Я имею ввиду неважно как 4 байта передаешь в виде указателя и самого числа
Крылатый
Ivan
Вот чувак, потом начинает всё передавать по значению. Это плохо. Термин не говорит, что происходит копирование
Крылатый
Ваще это уже проблема необразованности какая-то.
Ivan
Плохая семантика
cyberzx 🇷🇺
Не вижу никакой бессмысленности