# Python Program to Reverse a linked list

Given pointer to the head node of a linked list, the task is to reverse the linked list. We need to reverse the list by changing links between nodes.

Examples:

```Input : Head of following linked list
1->2->3->4->NULL
Output : Linked list should be changed to,
4->3->2->1->NULL

1->2->3->4->5->NULL
Output : Linked list should be changed to,
5->4->3->2->1->NULL

Input : NULL
Output : NULL

Input  : 1->NULL
Output : 1->NULL```

Iterative Method

## Python3

 `# Python program to reverse a linked list ` `# Time Complexity : O(n) ` `# Space Complexity : O(n) as 'next'  ` `#variable is getting created in each loop. ` ` `  `# Node class ` ` `  ` `  `class` `Node: ` ` `  `    ``# Constructor to initialize the node object ` `    ``def` `__init__(``self``, data): ` `        ``self``.data ``=` `data ` `        ``self``.``next` `=` `None` ` `  ` `  `class` `LinkedList: ` ` `  `    ``# Function to initialize head ` `    ``def` `__init__(``self``): ` `        ``self``.head ``=` `None` ` `  `    ``# Function to reverse the linked list ` `    ``def` `reverse(``self``): ` `        ``prev ``=` `None` `        ``current ``=` `self``.head ` `        ``while``(current ``is` `not` `None``): ` `            ``next` `=` `current.``next` `            ``current.``next` `=` `prev ` `            ``prev ``=` `current ` `            ``current ``=` `next` `        ``self``.head ``=` `prev ` ` `  `    ``# Function to insert a new node at the beginning ` `    ``def` `push(``self``, new_data): ` `        ``new_node ``=` `Node(new_data) ` `        ``new_node.``next` `=` `self``.head ` `        ``self``.head ``=` `new_node ` ` `  `    ``# Utility function to print the LinkedList ` `    ``def` `printList(``self``): ` `        ``temp ``=` `self``.head ` `        ``while``(temp): ` `            ``print` `(temp.data,end``=``" "``) ` `            ``temp ``=` `temp.``next` ` `  ` `  `# Driver program to test above functions ` `llist ``=` `LinkedList() ` `llist.push(``20``) ` `llist.push(``4``) ` `llist.push(``15``) ` `llist.push(``85``) ` ` `  `print` `(``"Given Linked List"``) ` `llist.printList() ` `llist.reverse() ` `print` `(``"\nReversed Linked List"``) ` `llist.printList() ` ` `  `# This code is contributed by Nikhil Kumar Singh(nickzuck_007) `

Output:

```Given Linked List
85 15 4 20
20 4 15 85```

Time Complexity: O(N)

Auxiliary Space: O(1)

A Simpler and Tail Recursive Method

## Python3

 `# Simple and tail recursive Python program to ` `# reverse a linked list ` ` `  `# Node class ` ` `  ` `  `class` `Node: ` ` `  `    ``# Constructor to initialize the node object ` `    ``def` `__init__(``self``, data): ` `        ``self``.data ``=` `data ` `        ``self``.``next` `=` `None` ` `  ` `  `class` `LinkedList: ` ` `  `    ``# Function to initialize head ` `    ``def` `__init__(``self``): ` `        ``self``.head ``=` `None` ` `  `    ``def` `reverseUtil(``self``, curr, prev): ` ` `  `        ``# If last node mark it head ` `        ``if` `curr.``next` `is` `None``: ` `            ``self``.head ``=` `curr ` ` `  `            ``# Update next to prev node ` `            ``curr.``next` `=` `prev ` `            ``return` ` `  `        ``# Save curr.next node for recursive call ` `        ``next` `=` `curr.``next` ` `  `        ``# And update next ` `        ``curr.``next` `=` `prev ` ` `  `        ``self``.reverseUtil(``next``, curr) ` ` `  `    ``# This function mainly calls reverseUtil() ` `    ``# with previous as None ` ` `  `    ``def` `reverse(``self``): ` `        ``if` `self``.head ``is` `None``: ` `            ``return` `        ``self``.reverseUtil(``self``.head, ``None``) ` ` `  `    ``# Function to insert a new node at the beginning ` ` `  `    ``def` `push(``self``, new_data): ` `        ``new_node ``=` `Node(new_data) ` `        ``new_node.``next` `=` `self``.head ` `        ``self``.head ``=` `new_node ` ` `  `    ``# Utility function to print the LinkedList ` `    ``def` `printList(``self``): ` `        ``temp ``=` `self``.head ` `        ``while``(temp): ` `            ``print``(temp.data,end``=``" "``) ` `            ``temp ``=` `temp.``next` ` `  ` `  `# Driver program ` `llist ``=` `LinkedList() ` `llist.push(``8``) ` `llist.push(``7``) ` `llist.push(``6``) ` `llist.push(``5``) ` `llist.push(``4``) ` `llist.push(``3``) ` `llist.push(``2``) ` `llist.push(``1``) ` ` `  `print``(``"Given linked list"``) ` `llist.printList() ` ` `  `llist.reverse() ` ` `  `print``(``"\nReverse linked list"``) ` `llist.printList() ` ` `  `# This code is contributed by Nikhil Kumar Singh(nickzuck_007) `

Output

```Given linked list
1 2 3 4 5 6 7 8
8 7 6 5 4 3 2 1 ```

Time Complexity: O(N)

Auxiliary Space: O(1)

Please refer complete article on Reverse a linked list for more details!

Whether you're preparing for your first job interview or aiming to upskill in this ever-evolving tech landscape, GeeksforGeeks Courses are your key to success. We provide top-quality content at affordable prices, all geared towards accelerating your growth in a time-bound manner. Join the millions we've already empowered, and we're here to do the same for you. Don't miss out - check it out now!

Previous
Next