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).