Reversing a Linked List in Python: Iterative and Recursive Methods

Introduction

A linked list is a fundamental data structure used in computer science and programming. It consists of a sequence of elements called nodes, where each node contains data and a reference (or link) to the next node in the sequence. The last node typically points to null to indicate the end of the list. One of the common operations performed on a linked list is reversing its order, which can be quite useful in various applications. In this article, we will explore how to reverse a linked list in Python using iterative and recursive method.

Reversing the Linked List: Approach

To reverse a linked list, we need to modify the links between the nodes. In the original list, each node points to the next one. After reversing, each node should point to the previous node, effectively reversing the direction of the links.

Here’s how the list would look after reversing:

reversing a linked list

Implementation in Python

Let’s implement the algorithm to reverse a linked list in Python. We’ll start by defining a Node class to represent each node of the linked list. Then, we’ll create a `LinkedList` class to handle the operations.


class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None

    def append(self, data):
        new_node = Node(data)
        if not self.head:
            self.head = new_node
        else:
            current = self.head
            while current.next:
                current = current.next
            current.next = new_node

    def reverse(self):
        prev = None
        current = self.head
        while current:
            next_node = current.next
            current.next = prev
            prev = current
            current = next_node
        self.head = prev

    def display(self):
        current = self.head
        while current:
            print(current.data, end=" -> ")
            current = current.next
        print("None")

# Test the implementation
if __name__ == "__main__":
    linked_list = LinkedList()
    linked_list.append(1)
    linked_list.append(2)
    linked_list.append(3)
    linked_list.append(4)

    print("Original linked list:")
    linked_list.display()

    linked_list.reverse()

    print("nReversed linked list:")
    linked_list.display()

The program outputs like the following:


Original linked list:
1 -> 2 -> 3 -> 4 -> None

Reversed linked list:
4 -> 3 -> 2 -> 1 -> None

Reverse a Linked List using Recursion

Reversing a linked list using recursion involves breaking down the problem into smaller sub problems until we reach the base case. The base case is when the current node is either `None` (indicating the end of the original list) or a single node (which becomes the new head of the reversed list). Here’s how you can implement the reverse operation using recursion in Python:


class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None

    def append(self, data):
        new_node = Node(data)
        if not self.head:
            self.head = new_node
        else:
            current = self.head
            while current.next:
                current = current.next
            current.next = new_node

    def reverse_recursive(self, current, prev=None):
        if not current:
            # Base case: reached the end of the list, 
            # so the previous node becomes the new head
            self.head = prev
            return

        next_node = current.next
        current.next = prev
        self.reverse_recursive(next_node, current)

    def reverse(self):
        self.reverse_recursive(self.head)

    def display(self):
        current = self.head
        while current:
            print(current.data, end=" -> ")
            current = current.next
        print("None")

# Test the implementation
if __name__ == "__main__":
    linked_list = LinkedList()
    linked_list.append(1)
    linked_list.append(2)
    linked_list.append(3)

    print("Original linked list:")
    linked_list.display()

    linked_list.reverse()

    print("nReversed linked list:")
    linked_list.display()

The following will be the output:


Original linked list:
1 -> 2 -> 3 -> 4 -> None

Reversed linked list:
4 -> 3 -> 2 -> 1 -> None

In this implementation, the `reverse_recursive()` method is called with the current node and its previous node as arguments. The method first checks if the current node is `None`, which indicates the end of the original list. If it is `None`, the base case is reached, and the `self.head` (which is currently pointing to the last node of the original list) is updated to the last node, effectively making it the new head of the reversed list. If the current node is not `None`, the method updates the links between nodes and continues the recursion with the next node.

Important Note

Remember that recursion can lead to stack overflow errors for large linked lists due to excessive function calls. For very long lists, it’s often more practical to use an iterative approach to reverse the linked list.

Summary

In this article, we discussed the topic of reversing a linked list in Python using both iterative and recursive approaches.

Reversing a linked list is a fundamental operation in computer science and programming. It involves modifying the links between the nodes of the original list to change the direction of traversal. We explored two different methods to achieve this: an iterative approach and a recursive approach.

The iterative approach involves traversing the linked list from the head to the end while updating the links between nodes to reverse their order. This method is straightforward, efficient, and suitable for most scenarios. Python’s simplicity and flexibility make it easy to implement an iterative solution to reverse a linked list.

On the other hand, the recursive approach involves breaking down the problem into smaller sub problems by using recursive function calls. At each step, the current node is connected to the previous one to reverse the list. When the end of the list is reached, the last node becomes the new head of the reversed list. While the recursive approach is elegant, it may not be the most efficient for very long linked lists due to potential stack overflow errors caused by excessive function calls.

Share your love
Subhankar Rakshit
Subhankar Rakshit

Hey there! I’m Subhankar Rakshit, the brains behind PySeek. I’m a Post Graduate in Computer Science. PySeek is where I channel my love for Python programming and share it with the world through engaging and informative blogs.

Articles: 194