Глядя на это ... предполагая, что вы не используете циклические списки, не могли бы вы просто перебрать свой массив случайного порядка, пока не найдете начальный узел (тот, с .Previous == null
) и затем вернете узел? Я имею в виду, что одним из преимуществ связанного списка является то, что вам не нужно хранить ссылки на все узлы в отдельной структуре данных, просто соединяйте их все друг с другом. (Ну, в зависимости от того, как используемая языковая реализация выполняет подсчет ссылок и сборку мусора, если это вообще происходит).
Но, по сути, если у вас нет немедленной необходимости после операции получить доступ к элементу на определенном расстоянии от начального узла, я бы рекомендовал просто немедленно возвращать начальный узел при обнаружении и затем лениво присваивать массиву соответствующего размера как вы используете каждый последующий узел. На самом деле, даже если вы создадите новый массив и назначите его, не будет ли наихудший случай по-прежнему просто O (n), где n - это число узлов? O (n), чтобы найти начальный узел, а затем еще один O (n) n, чтобы перебрать список, назначая каждому узлу соответствующий индекс в массиве того же размера, что и ваш входной массив.
<ч />
Исходя из вашего обновленного вопроса, вам может быть полезно реализовать временный набор связанных списков. Первоначально просматривая список, вы проверяете элементы Next
и Previous
каждого узла, а затем сохраняете Next
s и Previous
es в объектах типа словаря (я не уверен, что Для этого лучше всего подойдет объект .NET в качестве ключей, с узлами связанного списка, обернутыми вокруг существующих Node
s, ссылающихся на Item
s как значения. Таким образом, вы создадите ссылки по ходу процесса без какой-либо реальной сортировки и в конечном итоге просто выполните итерацию по вашему временному списку, назначив Node
s, обернутые узлами списка, в новый массив для возврата.
Это должно быть лучше, чем O (n ^ 2) из-за того, что доступ к словарям обычно в среднем постоянен (хотя в худшем случае асимптотическое поведение по-прежнему равно O (n)), я считаю.