Skip to main content

How to Reverse Linked List in Java? | Iterative and Recursive approach

Reverse Linked List (LL) using Iterative (While loop) and Recursive approach in Java

Reverse LinkedList with Iterative and Recursive in Java

In this article, we will seen both Recursive and Iterative approach for reversing Singly linked list with explanation.   

First we store data (value and next node reference) in LinkedList custom class one by one. and then reverse it using loop. 

Reverse Linked List using Iterative (While loop) and Recursive approach

For reversing linked list data, we do not need to swap any elements we just need to change next data for particular Node. 

Lets jump to code for better understanding.

Example 1 : Iterative (Loop) approach for reverse Linked List

class Node {    
    int data;    
    Node next;     

    // Constructor for initialize data
    public Node (int data) {    
        this.data = data;    
        this.next = null;    
    }    
}  

public class ReverseLLByIterative {    
    
    public static Node head = null;    
    public Node tail = null;  
        
    public void addNode(int data) {    

        Node newNode = new Node(data);   
            
        if (head == null) {    
            head = newNode;    
            tail = newNode;    
        } else {    
            tail.next = newNode;    
            tail = newNode;    
        }    
    }    
    
    Node reverseLL(Node head) {
        Node current = head;
        Node previous = null;
       
        while (current != null) {
            Node temp = current.next;
            current.next = previous;
            previous = current;
            current = temp;
        }
        return previous;
    }
    
    void printLinkedList(Node head) {
        Node current = head;   
        
        while(current != null) {    
            System.out.print(current.data + " ");    
            current = current.next;    
        }    
    }   
        
    public static void main(String[] args) {    
            
        ReverseLLByIterative obj = new ReverseLLByIterative();    
            
        obj.addNode(1);    
        obj.addNode(2);    
        obj.addNode(3);    
        obj.addNode(4);  
        obj.addNode(5);
        obj.addNode(6);
        
        System.out.println("Linked list before Reverse : ");  
        obj.printLinkedList(head);
        
        head = obj.reverseLL(head);
        System.out.println("\nLinked list after Reverse : ");  
        obj.printLinkedList(head);
    }
}   

Output :

Linked list before Reverse :
1 2 3 4 5 6
Linked list after Reverse :
6 5 4 3 2 1 

Code Explanation :

  • In Node class, declare two variables 1. int data and 2. Node next. data stores our values and next stores next reference Node.
  • In ReverseLLByIterative, we are adding new Node using addNode() method. For that we are passing int data. In addNode(), creating object of Node class and store data and next reference.
  • In reverseLL(), initialize current as head and previous Node as null.
    • Loop until current is not null (means we are at last Node. in our example 6 is last Node data).
      • First store next data of current to temp Node, so after deleting next reference we still have next Node.
      • Store previous Node to current Node. So first node refer NULL value. ( NULL , <- 1  2-> 3 -> 4 ->5 -> 6). Now current refers to NULL value rather than 2 Node.
      • Store previous Node to current and temp to current.
    • Return previous (It is first node after reversing).
  • In printLinkedList(), print all node values one by one.

 

Example 2 : Recursive approach for reverse Linked List

class Node {    
    int data;    
    Node next;    
        
    public Node(int data) {    
        this.data = data;    
        this.next = null;    
    }    
}  

public class ReverseLLByRecursive {

     public static Node head = null;    
        public Node tail = null;  
            
        public void addNode(int data) {    

            Node newNode = new Node(data);    
                
            if(head == null) {    
                head = newNode;    
                tail = newNode;    
            } else {    
                tail.next = newNode;    
                tail = newNode;    
            }    
        }   
        
        Node reverseLL(Node head) {
            
            if (head == null || head.next == null) {
                return head;
            }
            
            Node secondElement = head.next;
            head.next = null;
            Node newHead = reverseLL(secondElement);
            secondElement.next = head;
            return newHead;
        }
        
        void printLinkedList(Node head) {
            Node current = head;   
            
            while(current != null) {    
                System.out.print(current.data + " ");    
                current = current.next;    
            }    
        }   
    
    public static void main(String[] args) {
        
        ReverseLLByRecursive obj = new ReverseLLByRecursive();    
        
        obj.addNode(1);    
        obj.addNode(2);    
        obj.addNode(3);    
        obj.addNode(4);  
        obj.addNode(5);
        obj.addNode(6);
        
        System.out.println("Linked list before Reverse : ");  
        obj.printLinkedList(head);
        
        head = obj.reverseLL(head);
        System.out.println("\nLinked list after Reverse : ");  
        obj.printLinkedList(head);

    }
}

Code explanation :

  • In reverseLL() method, first check for null condition for head and head.next.
  • After we are storing head.next value to secondElement Node and store null to that (we are deleting reference).
  • Next call is recursion and it continue till it return null.
  • After recursion, we got newHead as last Node (6) and head as (5) and it done reverse for us like 6 -> 5 -> 4 -> 3 -> 2 -> 1 

 

Other articles you may like :



 

 

Comments

Popular posts from this blog

Plus Minus HackerRank Solution in Java | Programming Blog

Java Solution for HackerRank Plus Minus Problem Given an array of integers, calculate the ratios of its elements that are positive , negative , and zero . Print the decimal value of each fraction on a new line with 6 places after the decimal. Example 1 : array = [1, 1, 0, -1, -1] There are N = 5 elements, two positive, two negative and one zero. Their ratios are 2/5 = 0.400000, 2/5 = 0.400000 and 1/5 = 0.200000. Results are printed as:  0.400000 0.400000 0.200000 proportion of positive values proportion of negative values proportion of zeros Example 2 : array = [-4, 3, -9, 0, 4, 1]  There are 3 positive numbers, 2 negative numbers, and 1 zero in array. Following is answer : 3/6 = 0.500000 2/6 = 0.333333 1/6 = 0.166667 Lets see solution Solution 1 import java.io.*; import java.math.*; import java.security.*; import java.text.*; import java.util.*; import java.util.concurrent.*; import java.util.function.*; import java.util.regex.*; import java.util.stream.*; import static java.util.st

Flipping the Matrix HackerRank Solution in Java with Explanation

Java Solution for Flipping the Matrix | Find Highest Sum of Upper-Left Quadrant of Matrix Problem Description : Sean invented a game involving a 2n * 2n matrix where each cell of the matrix contains an integer. He can reverse any of its rows or columns any number of times. The goal of the game is to maximize the sum of the elements in the n *n submatrix located in the upper-left quadrant of the matrix. Given the initial configurations for q matrices, help Sean reverse the rows and columns of each matrix in the best possible way so that the sum of the elements in the matrix's upper-left quadrant is maximal.  Input : matrix = [[1, 2], [3, 4]] Output : 4 Input : matrix = [[112, 42, 83, 119], [56, 125, 56, 49], [15, 78, 101, 43], [62, 98, 114, 108]] Output : 119 + 114 + 56 + 125 = 414 Full Problem Description : Flipping the Matrix Problem Description   Here we can find solution using following pattern, So simply we have to find Max of same number of box like (1,1,1,1). And last