Another method is to utilize recursion, which may be slightly more difficult to understand but fundamentally accomplishes the same task. During the recursion, we traverse all the way to the last node while keeping track of the call stack (which contains the preceding nodes). Once we arrive at the end of the list, we begin to unwind, with each node's next pointer being directed to its predecessor (which corresponds to the parent call stack at this stage), thus reversing the pointers. In pseudocode: function recursive_reverse(node, previous = null) { if(node is null) return previous next = node.next node.next = previous return recursive_reverse(next, node) } You initiate the recursion by invoking this function as: recursive_reverse(head) .