Если вы выполните (reverse)
один раз, а затем просмотрите обратный список в последовательном порядке, итоговое значение должно составить всего O (2n) времени (O (n) для настройки, а затем еще одно O (n) для прохождения) и O (n) памяти.
Двусвязный список не очень сложен. Как вы знаете, список состоит из cons-ячеек, где автомобиль указывает на объект, а cdr указывает на следующую cons-ячейку в списке.
Один из способов создания двусвязного списка состоит в том, чтобы вместо него указывать cdr на другую cons-ячейку, чей cdr указывает на следующую cons-ячейку в списке, а автомобиль указывает на предыдущую cons-ячейку в списке. Затем вы используете cddr, чтобы двигаться вперед, и cdar, чтобы двигаться назад.
Я не знаю, что стандартные библиотечные функции имеют гарантированную сложность. Если спецификация не указывает, она будет определена реализацией.