Пример реверсирования дерева

Дан список с возможными подсписками. Задача - изменить порядок всех элементов списка, причем порядок в подсписках также должен быть изменён на обратный.

(defun reverse-tree (arg)
  (if (atom arg)
      arg
      (let ((acc ()))    ; список-накопитель
        (dolist (head arg)
          (push (reverse-tree head) acc))
        acc)))
(reverse-tree '(a b (1 2) (3 4 5) c)))
(C (5 4 3) (2 1) B A)

Сложность алгоритма - О(n), где n - общее число листьев (атомов) в дереве.