В: Каждый узел связанного списка имеет случайный указатель (в дополнение к следующему указателю), который может случайно указывать на другой узел или быть нулевым. Как бы вы продублировали такой связанный список?
A: Вот что у меня есть, я просто хотел ратифицировать, если это был оптимальный способ сделать это.
Поскольку не указано никаких ограничений по пространству, я собираюсь использовать LinkedHashSet
и LinkedHashMap
(я могу представить, что люди уже кивают головой в разногласии;))
Первая итерация: Сделайте очевидное - прочитайте каждый узел из списка, который нужно скопировать, и создайте узлы в новом списке. Затем прочитайте случайный узел следующим образом: this.random.data
и вставьте в LinkedHashSet
.
Вторая итерация: итерация по новому списку и добавление данных каждого узла в качестве первого столбца и самого узла в качестве второго столбца в LinkedHashMap
(не нужно связывать, но я просто собираюсь с поток).
Третья итерация: перебирайте LinkedHashSet
(это причина, по которой это должно быть связано - предсказуемое упорядочение) и новый список одновременно. Для первого узла прочитайте первую запись LinkedHashSet
, найдите соответствующий объект в LinkedHashMap
и добавьте в качестве случайного узла текущий узел в новом списке.
3 итерации кажутся немного сумасшедшими, но попытка была сохранить сложность как O (N). Любое решение, которое улучшает требования к пространству O (3N) и сложности времени выполнения O (3N), было бы замечательно. Спасибо!
Редактировать: запись из LinkedHashSet
может быть удалена при вводе в LinkedHashMap
, поэтому для этого потребуется только O (2N) пробел.