Я думаю, вы в замешательстве. Вы говорите, что O (n log (n)) на самом деле хуже, чем O (n). Возможно, вы имеете в виду O (log n)? Если так, ответ - нет. Вы не можете инвертировать связанный список в O (log n). O (n) тривиально (и очевидное решение). O (n log (n)) не имеет большого смысла.
Редактировать: Хорошо, значит, вы имеете в виду O (n log (n)). Тогда ответ - да. Как? Легко. Вы сортируете список:
- Подсчитайте длину списка. Стоимость: O (n);
- Создать массив того же размера;
- Скопируйте элементы связанного списка в массив в порядке random , поместив исходный порядок как часть элемента. Например: [A, B, C] -> [(B, 2), (C, 3), (A, 1)]. Стоимость: O (n);
- Сортировка массива с использованием эффективной сортировки (например, быстрой сортировки) в обратном исходном порядке, например [(C, 3), (B, 2), (A, 1)]. Стоимость: O (n log (n));
- Создать связанный список из обращенного массива. Стоимость: O (n).
Общая стоимость: O (n log (n))
Несмотря на все промежуточные этапы, сортировка является самой дорогой операцией. O (n) других шагов постоянны (то есть количество шагов не является фактором n), поэтому общая стоимость O (n log (n)).
Редактировать 2: Изначально я не располагал элементы списка в случайном порядке, но понял, что можно утверждать, что эффективная сортировка в уже отсортированном списке была меньше O (n log (n)) даже если бы вы это изменили. Теперь я не совсем уверен, что это так, но вышеприведенная редакция устраняет эту потенциальную критику.
И да, это патологический вопрос (и ответ). Конечно, вы можете сделать это в O (n).