Linked List is one of the most important data structures in computer science due to several reasons. The most important one is the drawbacks of the array data structure. Deletion of the elements of the array data structure is highly in-efficient and requires a very time-consuming process. Linked list overcomes this drawback as well as many other drawbacks of the array data structure with the help of concepts such as pointers and references. In this article, we will discuss how to reverse a singly linked list using two approaches.
Reverse Singly Linked List
Given a Singly Linked list containing n number of predefined nodes, the main task is to reverse the linked list without using any other linked lists.
Input: 1->2->3->4->5->null Output: 5->4->3->2->1->null Input: null Output null Input: 2->null Output 2->null
Approach 1: Simple Iterative Approach
This approach is a little tricky. In this approach, we use three-pointers or three references.
- Iterate the original Linked List using for loop or while loop and do the following operations.
- Store the current.next element in one reference or pointer of the node.
- Change the current.next reference/pointer to the second reference.
- Update the second reference/Pointer with the current element.
- Update the current reference/Pointer.
Java:
//Importing Libraries import java.util.*; import java.io.*; class Main{ //Creating head reference of the linked list static Node head; //Creating static class of the linked list static class Node{ int data; //Data to be stored in the node of the linked list Node next; //Reference of the node in the linked list //Constructor of the static class public Node(int data){ this.data=data; } } //Function to insert the node in the linked list static void push(int data){ if(head==null){ //Insert the head if the linked list is null head=new Node(data); } else{ Node temp=head; //Iterate the linked list while(temp.next!=null){ temp=temp.next; } temp.next=new Node(data); } } //Function to print the linked list static void print(Node head){ Node temp=head; while(temp!=null){ //Printing the data of the node System.out.print(temp.data+" "); //Increment the node of the linked list temp=temp.next; } System.out.println(); } //Function to reverse the linked list static Node reverse(Node head){ Node current=head; //Creating two reference //First reference Node previous_node=null; Node previous_previous_node=null; while(current!=null){ //Store the current.next reference previous_node=current.next; //Initialize the current.next last previous node current.next=previous_previous_node; //Update the last previous node current element previous_previous_node=current; current=previous_node; } //Return the reversed Linked list return previous_previous_node; } public static void main(String[] args) { //Creating Head of the linked list push(1); //Creating second node of the linked list push(2); //Creating third node of the linked list push(3); //Creating fourth node of the linked list push(4); //Creating fifth node of the linked list push(5); System.out.println("Original Linked List"); print(head); System.out.println("Reversed Linked List"); Node head_reversed=reverse(head); print(head_reversed); } }
Output:
Python:
#Creating Node class class Node: #Creating Constructor def __init__(self,data): self.data=data #Creating data to be stored in the node of the linked list self.next=None #Creating next reference of the node #Creating class of Linked class class LinkedList: #Creating Constructor def __init__(self): self.head=None #Funcion to insert new node in the linked list def insert(self,data): #Checking if head is not None if self.head is None: self.head=Node(data) else: last=self.head while(last.next): last=last.next #Insert last node in the linked list last.next=Node(data) #Function to print the Linked list def print(self): #Creating temp reference of the head temp=self.head LinkedList=[] #Iterate the Linked list while(temp is not None): #Storting the node data in the list LinkedList.append(temp.data) temp=temp.next #Printing the list print(LinkedList) #Function to reverse the Linked list def reverse(self): #Creating two reference current=self.head #First reference previous=None #Second reference previous_previous=None while(current is not None): #Store the current.next reference previous=current.next #Initialize the current.next last previous node current.next=previous_previous #Update the last previous node current element previous_previous=current current=previous self.head=previous_previous list=LinkedList() #Inserting First Node in the Linked List list.insert(1) #Inserting Second Node in the Linked List list.insert(2) #Inserting Third Node in the Linked List list.insert(3) print("Original Linked List") list.print() list.reverse() #Printing Reversed Linked List print("Reversed Linked List") list.print()
Output:
C++:
//Importing all the required libraries #include<bits/stdc++.h> using namespace std; //Creating structure for the node of linked list struct Node{ int data;//data to be stored to the node in the linked list Node*next;//next reference to the node in the linked list //Creating Constructor Node(int data){ this->data=data; //Storing the data to the node this->next=nullptr; } }; //Function to Transverse the Linked list void print(Node *head){ //Checking if the Linked list is null or not Node *temp=head; if(temp==NULL){ return; } //Transverse the Linked List while(temp!=NULL){ cout<data<<" "; temp=temp->next; } } //Function reverse the linked list Node* reverse_LinkedList(Node *head){ //Creating two pointers Node *current=head; //First pointer Node *previous=NULL; //Second pointer Node *previous_previous=NULL; while(current!=NULL){ //Store the current->next reference previous=current->next; //Update the last previous node current->next=previous_previous; //Update the last previous node previous_previous=current; current=previous; } head=previous_previous; //Returning the Reversed Linked list return head; } int main(){ //Creating Head of the linked list Node *head =new Node(10); //Creating Second node of the linked list head->next=new Node(11); //Creating third node of the linked list head->next->next=new Node(12); //Printing Original Linked List printf("Original Linked List\n"); print(head); printf("\n"); //Printing Reversed Linked List printf("Reversed linked list\n"); Node * head1=reverse_LinkedList(head); print(head1); return 0; }
Output:
Complexity:
- Time Complexity : The Time complexity of this approach is O(n).
- Space Complexity : The Space Complexity of this approach is O(1).
Approach 2: (Recursive Approach)
In this approach, we will use recursion to reverse the original linked list.
- Divide the Linked list into two halves, the first node and the remaining nodes of the original list.
- Call recursive function and link the remaining Linked list to the first node of the original linked list.
- At last the change the head Pointer/Reference of the Linked List.
Java
//Importing Libraries import java.util.*; import java.io.*; class Main{ //Creating head reference of the linked list static Node head; //Creating static class of the linked list static class Node{ int data; //Data to be stored in the node of the linked list Node next; //Reference of the node in the linked list //Constructor of the static class public Node(int data){ this.data=data; } } //Function to insert the node in the linked list static void push(int data){ if(head==null){ //Insert the head if the linked list is null head=new Node(data); } else{ Node temp=head; //Iterate the linked list while(temp.next!=null){ temp=temp.next; } temp.next=new Node(data); } } //Function to print the linked list static void print(Node head){ Node temp=head; while(temp!=null){ //Printing the data of the node System.out.print(temp.data+" "); //Increment the node of the linked list temp=temp.next; } System.out.println(); } //Function to reverse the linked list static Node reverse(Node head){ //Checking the base condition if(head==null||head.next==null){ return head; } //Recursively call the remaining Linked list Node small=reverse(head.next); //Update the head of the Linked List //Reverse the two nodes head.next.next=head; //Update the head pointer/Reference head.next=null; return small; } public static void main(String[] args) { //Creating Head of the linked list push(1); //Creating second node of the linked list push(2); //Creating third node of the linked list push(3); //Creating fourth node of the linked list push(4); //Creating fifth node of the linked list push(5); System.out.println("Original Linked List"); print(head); System.out.println("Reversed Linked List"); Node head_reversed=reverse(head); print(head_reversed); } }
Output:
C++:
//Importing all the required libraries #include #include #include<bits/stdc++.h> using namespace std; //Creating structure for the node of linked list struct Node{ int data;//data to be stored to the node in the linked list Node*next;//next reference to the node in the linked list //Creating Constructor Node(int data){ this->data=data; //Storing the data to the node this->next=nullptr; } }; //Function to Transverse the Linked list void print(Node *head){ //Checking if the Linked list is null or not Node *temp=head; if(temp==NULL){ return; } //Transverse the Linked List while(temp!=NULL){ cout<data<<" "; temp=temp->next; } } //Function reverse the linked list Node *reverse_LinkedList(Node *head){ //Checking the base condition if(head->next==NULL||head==NULL){ return head; } //Recursively call the remaining node of the linked list Node* remaining=reverse_LinkedList(head->next); //Update the reference of the head pointer head->next->next=head; head->next=NULL; return remaining; } int main(){ //Creating Head of the linked list Node *head =new Node(10); //Creating Second node of the linked list head->next=new Node(11); //Creating third node of the linked list head->next->next=new Node(12); //Printing Original Linked List printf("Original Linked List\n"); print(head); printf("\n"); //Printing Reversed Linked List printf("Reversed linked list\n"); Node * head1=reverse_LinkedList(head); print(head1); return 0; }
Output:
Python:
#Creating Node class class Node: def __init__(self,data): self.data=data #Creating data of the node self.next=None #Creating next reference of the node of the linked list #Creating Linked List class LinkedList: #Creating Linked List class constructor def __init__(self): self.head=None #Function to push the node in the linked list def push(self,data): node=Node(data) node.next=self.head self.head=node #Update the head pointer #Function to reverse the Linked list def reverse(self,head): #Checking the head of the linked list if head is None or head.next is None: return head #Recursively call the remaining node of the linked list remaining=self.reverse(head.next) #Update the head reference in the linked list head.next.next=head head.next=None #Return the Reversed Linked List return remaining #Function to print the LinkedList def printList(self): temporary_List=self.head List=[] #Iterate the Linked List while(temporary_List): #Add the node value to the list List.append(temporary_List.data) temporary_List=temporary_List.next #Print the List print(List) #Creating List reference of the Linked List List=LinkedList() #Inserting node in the Single list List.push(1) List.push(2) List.push(3) #Printing the original linked list print("Original Linked List") List.printList() #Printing the reversed Linked List print("Reversed Linked List") List.head=List.reverse(List.head) List.printList()
Output:
Conclusion
Reversing a Linked List is one of the most interesting problems of Data structure. In this article, we have discussed two approaches to Reverse a linked list. One approach is using a simple iteration with three-pointers/reference concepts and a second approach is a recursive approach. There are so many interesting projects that can be easily made using the concept of Reversing a Linked list and the most common example is Snake Game .
We hope this article will help you to understand the problem statement and you will be able to solve any other variation of this problem.
Happy Coding!
People are also reading:
- Maximum size square sub-matrices with all 1’s
- Merge Sort for Linked Lists
- Convert a Binary Tree to Doubly Linked List
- Minimum Edit Distance
- WAP to Print Square Using * Character
- Rearrange an array in maximum minimum form
- Print a given matrix in spiral form
- Sort binary array in linear time
- Write a Program to read from a text file and then write in another text file
- Move all zeros present in an array to the end
Leave a Comment on this Post