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