## DEV Community is a community of 724,337 amazing developers

We're a place where coders share, stay up-to-date and grow their careers.

Kaitian Xie

Posted on • Updated on

# Iterative

``````def reverse_list(head)
prev = nil
until curr.nil?
temp = curr.next
curr.next = prev
prev = curr
curr = temp
end
prev
end
``````

The purpose of this approach is to change the `next` pointer of a node to point to its previous node. Before we start looping through each node, we need the pointer `prev` to store the previous node. Also, while we are iterating through the nodes, we need the `temp` node so that we can swap `cur` node with `cur.next` node, which will be the node we process in the next iteration.

Time complexity: `O(n)`

Extra memory: `O(1)`

# Recursive

``````def reverse_list(head)

Although the recursive approach is as efficient as the iterative one, it is hard to figure out. Let's assume that we have a linked list `n1 -> n2 -> n3 -> nill`. Assume that the last two have been reversed. i.e. `n1 -> n2 -> n3 <- nill`, and you are at the `n2`. You want the `next` of `n3` to point to `n2`, i.e `n2.next.next = n2`. Following this logic, we can come out with the above code.
Time complexity: `O(n)`
Extra memory: `O(1)`