Skip to content
Related Articles

Related Articles

Improve Article
Save Article
Like Article

Java Program To Flatten A Multi-Level Linked List Depth Wise- Set 2

  • Last Updated : 03 Jan, 2022

We have discussed flattening of a multi-level linked list where nodes have two pointers down and next. In the previous post, we flattened the linked list level-wise. How to flatten a linked list when we always need to process the down pointer before next at every node.

Input:  
1 - 2 - 3 - 4
    |
    7 -  8 - 10 - 12
    |    |    |
    9    16   11
    |    |
    14   17 - 18 - 19 - 20
    |                    |
    15 - 23             21
         |
         24

Output:        
Linked List to be flattened to
1 - 2 - 7 - 9 - 14 - 15 - 23 - 24 - 8
 - 16 - 17 - 18 - 19 - 20 - 21 - 10 - 
11 - 12 - 3 - 4
Note: 9 appears before 8 (When we are 
at a node, we process down pointer before 
right pointer)

Source: Oracle Interview

If we take a closer look, we can notice that this problem is similar to tree to linked list conversion. We recursively flatten a linked list with the following steps:

  1. If the node is NULL, return NULL.
  2. Store the next node of the current node (used in step 4).
  3. Recursively flatten down the list. While flattening, keep track of the last visited node, so that the next list can be linked after it. 
  4. Recursively flatten the next list (we get the next list from the pointer stored in step 2) and attach it after the last visited node.

Below is the implementation of the above idea. 

Java




// Java program to flatten a multilevel 
// linked list
public class FlattenList 
{
    static Node last;
  
    // Flattens a multi-level linked 
    // list depth wise 
    public static Node flattenList(Node node)
    {
        if(node==null
            return null
    
        // To keep track of last visited node 
        // (NOTE: This is static)  
        last = node; 
    
        // Store next pointer 
        Node next = node.next; 
    
        // If down list exists, process it 
        // first. Add down list as next of 
        // current node 
        if(node.down!=null
            node.next = flattenList(node.down); 
    
        // If next exists, add it after the
        // next of last added node 
        if(next!=null
            last.next = flattenList(next); 
    
        return node; 
    }
  
    // Utility method to print a linked list
    public static void printFlattenNodes(Node head) 
    
        Node curr=head;
        while(curr!=null
        
            System.out.print(curr.data+" ");
            curr = curr.next;
        
          
    
      
    // Utility function to create a 
    // new node 
    public static Node push(int newData) 
    
        Node newNode = new Node(newData); 
        newNode.next =null
        newNode.down = null
        return newNode; 
    
      
    // Driver code
    public static void main(String args[]) 
    {
        Node head=new Node(1);
        head.next = new Node(2); 
        head.next.next = new Node(3); 
        head.next.next.next = new Node(4); 
        head.next.down = new Node(7); 
        head.next.down.down = new Node(9); 
        head.next.down.down.down = new Node(14); 
        head.next.down.down.down.down = 
        new Node(15); 
        head.next.down.down.down.down.next = 
        new Node(23); 
        head.next.down.down.down.down.next.down = 
        new Node(24); 
        head.next.down.next = new Node(8); 
        head.next.down.next.down = new Node(16); 
        head.next.down.next.down.down= new Node(17); 
        head.next.down.next.down.down.next= 
        new Node(18); 
        head.next.down.next.down.down.next.next = 
        new Node(19); 
        head.next.down.next.down.down.next.next.next = 
        new Node(20); 
        head.next.down.next.down.down.next.next.next.down = 
        new Node(21); 
        head.next.down.next.next = new Node(10); 
        head.next.down.next.next.down = new Node(11); 
        head.next.down.next.next.next = new Node(12); 
        head = flattenList(head); 
        printFlattenNodes(head);
    }
}
  
// Node of Multi-level Linked List
class Node
{
    int data;
    Node next,down;
    Node(int data)
    {
        this.data=data;
        next=null;
        down=null;
    }
}
//This code is contributed by Gaurav Tiwari

Output: 

1 2 7 9 14 15 23 24 8 16 17 18 19 20 21 10 11 12 3 4

Alternate implementation using the stack data structure

Java




Node flattenList2(Node head)
{
    Node headcop = head;
    Stack<Node> save = new Stack<>();
    save.push(head);
    Node prev = null;
  
    while (!save.isEmpty()) {
        Node temp = save.peek();
        save.pop();
  
        if (temp.next)
            save.push(temp.next);
        if (temp.down)
            save.push(temp.down);
  
        if (prev != null)
            prev.next = temp;
  
        prev = temp;
    }
    return headcop;
}
// This code is contributed by aashish1995 


Please refer complete article on Flatten a multi-level linked list | Set 2 (Depth wise) for more details!

My Personal Notes arrow_drop_up
Recommended Articles
Page :

Start Your Coding Journey Now!