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

Queen's Attack II HackerRank Solution in Java with Explanation

Queen's Attack II Problem's Solution in Java (Chessboard Problem)   Problem Description : You will be given a square chess board with one queen and a number of obstacles placed on it. Determine how many squares the queen can attack.  A queen is standing on an n * n chessboard. The chess board's rows are numbered from 1 to n, going from bottom to top. Its columns are numbered from 1 to n, going from left to right. Each square is referenced by a tuple, (r, c), describing the row r and column c, where the square is located. The queen is standing at position (r_q, c_q). In a single move, queen can attack any square in any of the eight directions The queen can move: Horizontally (left, right) Vertically (up, down) Diagonally (four directions: up-left, up-right, down-left, down-right) The queen can move any number of squares in any of these directions, but it cannot move through obstacles. Input Format : n : The size of the chessboard ( n x n ). k : The number of obstacles...

Java Hashset HackerRank Solution | Programming Blog

Java Hashset HackerRank Solution with Explanation   Problem Statement :- In computer science, a set is an abstract data type that can store certain values, without any particular order, and no repeated values. {1,2,3} is an example of a set, but {1,2,2} is not a set. Today you will learn how to use sets in java by solving this problem. You are given n pairs of strings. Two pairs (a,b) and (c,d) are identical if a = c and b = d. That also implies (a,b) is not same as (b,a). After taking each pair as input, you need to print number of unique pairs you currently have. See full problem description in HackerRank Website :- https://www.hackerrank.com/challenges/java-hashset/problem Let's see solution of problem. import java.util.HashSet; import java.util.Scanner; public class Solution {     public static void main(String[] args) {         Scanner s = new Scanner(System.in);         System.out.println("Enter tot...