Open In App

Java Program For Reversing A Linked List In Groups Of Given Size – Set 1

Given a linked list, write a function to reverse every k nodes (where k is an input to the function). 

Example: 



Input: 1->2->3->4->5->6->7->8->NULL, K = 3 
Output: 3->2->1->6->5->4->8->7->NULL 
Input: 1->2->3->4->5->6->7->8->NULL, K = 5 
Output: 5->4->3->2->1->8->7->6->NULL 

Algorithm: reverse(head, k) 



Below is image shows how the reverse function works: 

Below is the implementation of the above approach:




// Java program to reverse a 
// linked list in groups of
// given size
class LinkedList
{
    // Head of list
    Node head; 
  
    // Linked list Node
    class Node 
    {
        int data;
        Node next;
        Node(int d)
        {
            data = d;
            next = null;
        }
    }
  
    Node reverse(Node head, int k)
    {
        if(head == null)
          return null;
        Node current = head;
        Node next = null;
        Node prev = null;
  
        int count = 0;
  
        // Reverse first k nodes of 
        // linked list
        while (count < k && 
               current != null
        {
            next = current.next;
            current.next = prev;
            prev = current;
            current = next;
            count++;
        }
  
        /* next is now a pointer to (k+1)th node
           Recursively call for the list starting from
           current. And make rest of the list as next of
           first node */
        if (next != null)
            head.next = reverse(next, k);
  
        // prev is now head of the input list
        return prev;
    }
  
    // Utility functions
  
    // Inserts a new Node at front
    // of the list.
    public void push(int new_data)
    {
        /* 1 & 2: Allocate the Node &
                  Put in the data*/
        Node new_node = new Node(new_data);
  
        // 3. Make next of new Node 
        // as head 
        new_node.next = head;
  
        // 4. Move the head to point to
        // new Node
        head = new_node;
    }
  
    // Function to print linked list
    void printList()
    {
        Node temp = head;
        while (temp != null
        {
            System.out.print(temp.data + " ");
            temp = temp.next;
        }
        System.out.println();
    }
  
    // Driver code
    public static void main(String args[])
    {
        LinkedList llist = new LinkedList();
  
        // Create Linked List is 
        // 1->2->3->4->5->6->
        // 7->8->8->9->null
        llist.push(9);
        llist.push(8);
        llist.push(7);
        llist.push(6);
        llist.push(5);
        llist.push(4);
        llist.push(3);
        llist.push(2);
        llist.push(1);
  
        System.out.println("Given Linked List");
        llist.printList();
  
        llist.head = llist.reverse(llist.head, 3);
  
        System.out.println("Reversed list");
        llist.printList();
    }
}
// This code is contributed by Rajat Mishra 

Output: 

Given Linked List
1 2 3 4 5 6 7 8 9 
Reversed list
3 2 1 6 5 4 9 8 7 

Complexity Analysis: 

Please refer complete article on Reverse a Linked List in groups of given size | Set 1 for more details!


Article Tags :