Open In App

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

Last Updated : 14 Feb, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

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. 

Javascript




<script>
// Javascript program to flatten
// a multilevel linked list
 
// Node of Multi-level Linked List
class Node
{
    constructor(val)
    {
        this.data = val;
        this.down = null;
        this.next = null;
    }
}
var last;
 
// Flattens a multi-level linked
// list depth wise
function flattenList(node)
{
    if (node == null)
        return null;
 
    // To keep track of last visited
    // node
    // (NOTE: This is )
    last = node;
 
    // Store next pointer
    var 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
function printFlattenNodes(head)
{
    var curr = head;
    while (curr != null)
    {
        document.write(curr.data + " ");
        curr = curr.next;
    }
}
 
// Utility function to create a
// new node
function push(newData)
{
    var newNode = new Node(newData);
    newNode.next = null;
    newNode.down = null;
    return newNode;
}
 
// Driver code
var 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);
// This code is contributed by aashish1995
</script>


Output: 

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

Time complexity :  O(n)

Space complexity : O(1)

Alternate implementation using the stack data structure

Javascript




<script>
function flattenList2(head)
{
    var headcop = head;
    var save = new Stack();
    save.push(head);
    var prev = null;
 
    while (!save.isEmpty())
    {
        var temp = 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
</script>


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



Previous Article
Next Article

Similar Reads

C++ Program To Flatten A Multi-Level Linked List Depth Wise- Set 2
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 |
4 min read
Java Program To Flatten A Multi-Level Linked List Depth Wise- Set 2
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 |
4 min read
Python Program To Flatten A Multi-Level Linked List Depth Wise- Set 2
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 |
4 min read
Flatten a multi-level linked list | Set 2 (Depth wise)
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 |
3 min read
How to flatten a given array up to the specified depth in JavaScript ?
In this article, we will learn how to flatten a given array up to the specified depth in JavaScript. The flat() method in JavaScript is used to flatten an array up to the required depth. It creates a new array and recursively concatenates the sub-arrays of the original array up to the given depth. The only parameter this method accepts is the optio
1 min read
Flatten JavaScript objects into a single-depth Object
Given a nested JavaScript object, the task is to flatten the object and pull out all the values to a single depth. If the values are already at a single depth then it returns the result unaltered. typeof() method: The typeof() method is used in the script to check the type of JavaScript variable. Syntax:typeof(variable);Parameters: Variable: The in
2 min read
Javascript Program to Sort the matrix row-wise and column-wise
Given a n x n matrix. The problem is to sort the matrix row-wise and column wise.Examples:   Input : mat[][] = { {4, 1, 3}, {9, 6, 8}, {5, 2, 7} } Output : 1 3 4 2 5 7 6 8 9 Input : mat[][] = { {12, 7, 1, 8}, {20, 9, 11, 2}, {15, 4, 5, 13}, {3, 18, 10, 6} } Output : 1 5 8 12 2 6 10 15 3 7 11 18 4 9 13 20   Approach: Following are the steps:  Sort e
2 min read
Flatten a binary tree into linked list | Set-2
Given a binary tree, flatten it into a linked list. After flattening, the left of each node should point to NULL and right should contain next node in level order. Example: Input: 1 / \ 2 5 / \ \ 3 4 6 Output: 1 \ 2 \ 3 \ 4 \ 5 \ 6 Input: 1 / \ 3 4 / 2 \ 5 Output: 1 \ 3 \ 4 \ 2 \ 5 Approach: An approach using recursion has already been discussed in
9 min read
Flatten a binary tree into linked list | Set-3
Given a binary tree, flatten it into linked list in-place. Usage of auxiliary data structure is not allowed. After flattening, left of each node should point to NULL and right should contain next node in level order. Examples: Input: 1 / \ 2 5 / \ \ 3 4 6 Output: 1 \ 2 \ 3 \ 4 \ 5 \ 6 Input: 1 / \ 3 4 / 2 \ 5 Output: 1 \ 3 \ 4 \ 2 \ 5 Approach: Rec
8 min read
C++ Program to Sort the matrix row-wise and column-wise
Given a n x n matrix. The problem is to sort the matrix row-wise and column wise.Examples:   Input : mat[][] = { {4, 1, 3}, {9, 6, 8}, {5, 2, 7} } Output : 1 3 4 2 5 7 6 8 9 Input : mat[][] = { {12, 7, 1, 8}, {20, 9, 11, 2}, {15, 4, 5, 13}, {3, 18, 10, 6} } Output : 1 5 8 12 2 6 10 15 3 7 11 18 4 9 13 20   Approach: Following are the steps:  Sort e
3 min read
Article Tags :
Practice Tags :