Ну, во-первых, вам нужно определить, что означает «обратный» в этом контексте. Вероятно, что вам нужно сделать, это
(1) найти ссылку, которая делает его циклическим
(2) разорвать эту ссылку
(3) затем как-то перевернуть список.
Эффективное выполнение будет означать нахождение какого-либо эффективного способа идентификации цикла. Но если мы предполагаем стек с операцией, которая сообщает, существует ли узел, тогда вы можете просто поместить узлы в стек, проверяя, пока не дадите ссылку на узел, который вы уже видели. Затем вытолкните стек и вуаля у вас есть список в обратном порядке.
в псевдокоде, вам нужен стек с операцией isIn
stack:
init()
push(node)
pop() returns node
isIn(node) returns Boolean
и сделайте что-то вроде
do
get next node
if node isIn stack
then
while stack not empty
pop node
break
else
push node in stack
fi
od