Я думаю, вы смущены. Вы говорите O (n log (n)), что на самом деле хуже, чем O (n). Возможно, вы имеете в виду O (log n)? Если это так, ответ - нет. Вы не можете инвертировать связанный список в O (log n). O (n) тривиально (и очевидное решение). O (n log (n)) не имеет большого смысла.
Редактировать: Итак, вы имеете в виду O (n log (n)). Тогда ответ «да». Как? Легко. Вы сортируете:
- Подсчитайте длину списка. Стоимость: O (n);
- Создайте массив такого же размера;
- Скопируйте элементы связанного списка в массив в случайный заказ, положив первоначальный заказ как часть элемента. Например: [A, B, C] -> [(B, 2), (C, 3), (A, 1)]. Стоимость: O (n);
- Сортируйте массив, используя эффективную сортировку (например, быструю сортировку) в инвертированном исходном порядке, например [(C, 3), (B, 2), (A, 1)]. Стоимость: O (n log (n));
- Создайте связанный список из реверсивного массива. Стоимость: O (n).
Общая стоимость: O (п журнал (п))
Несмотря на все промежуточные этапы, вид является наиболее дорогостоящей операцией. Остальные шаги O (n) являются постоянными (это означает, что количество шагов не является коэффициентом n), поэтому общая стоимость равна O (n log (n)).
Редактировать 2: Я изначально не поместил элементы списка в произвольном порядке, но понял, что вы можете утверждать, что эффективный сортировка по уже отсортированному списку была меньше O (n log (n)), даже если вы реверсировали его. Теперь я не полностью убежден, что это так, но вышеупомянутая редакция устраняет эту потенциальную критику.
И да, это патологический вопрос (и ответ). Конечно, вы можете сделать это в O (n).
ли как О (п), а на 'i'th узел, do' log (i) 'nops. –
Как быстрый педантичный nitpick: ваш алгоритм 'O (n)' ** является алгоритмом 'O (n logN)', поэтому один ответ на ваш вопрос - это немодифицированный алгоритм O (n). 'O (n log n)' - это набор алгоритмов, которые растут не быстрее, чем n log n, и включают в себя те, которые являются «O (n)» и даже «O (1)». Чтобы ограничить те в тех же асимптотических границах в обоих направлениях, вам нужно сказать 'Θ (n)'. (На практике большинство людей на самом деле означает 'Θ (n)', когда говорят «O (n)») – Brian