Как Вы уже видите, вариантов много. Я предложу ещё пару:
1) Напишите рекурсивную функцию. Я
подозреваю, что от Вас хотят именно этого. Функция делает немного: если остаток списка после текущего элемента (хвост) не пуст, вызывает сама себя, передавая параметром этот хвост. А после этого печатает текущий элемент списка.
2) напишите дополнительную функцию, которая переставляет элементы списка в обратном порядке. После чего Ваша задача решается в три шага: инвертировать порядок, напечатать список в новом прямом порядке, инвертировать список (приводя его в первоначальное состояние).
Оба способа достаточно эффективны. Как и у всего на свете, у них есть недостатки: первый может переполнить стек вызовов, второй изменяет список (что может быть недопустимо).