Java Program To Flatten A Multi-Level Linked List Depth Wise- Set 2
Last Updated :
13 Feb, 2023
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:
- If the node is NULL, return NULL.
- Store the next node of the current node (used in step 4).
- Recursively flatten down the list. While flattening, keep track of the last visited node, so that the next list can be linked after it.
- 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
Time complexity : O(n), where n is the total number of nodes in the multi-level linked list. This is because the code processes each node in the list exactly once and the operations performed on each node take constant time.
The space complexity : O(1), as it does not use any additional data structures to store the nodes. The code only uses a few variables to keep track of the current node and the last node visited.
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!
Similar Reads
Java Program For Flattening A Multilevel Linked List Given a linked list where in addition to the next pointer, each node has a child pointer, which may or may not point to a separate list. These child lists may have one or more children of their own, and so on, to produce a multilevel data structure, as shown in the below figure. You are given the he
5 min read
Java Program To Delete Middle Of Linked List Given a singly linked list, delete the middle of the linked list. For example, if the given linked list is 1->2->3->4->5 then the linked list should be modified to 1->2->4->5 If there are even nodes, then there would be two middle nodes, we need to delete the second middle element. For example, if g
4 min read
Java Program To Merge K Sorted Linked Lists Using Min Heap - Set 2 Given k linked lists each of size n and each list is sorted in non-decreasing order, merge them into a single sorted (non-decreasing order) linked list and print the sorted linked list as output.Examples: Input: k = 3, n = 4 list1 = 1->3->5->7->NULL list2 = 2->4->6->8->NULL l
5 min read
Java Program For Flattening A Linked List Given a linked list where every node represents a linked list and contains two pointers of its type: Pointer to next node in the main list (we call it 'right' pointer in the code below).Pointer to a linked list where this node is headed (we call it the 'down' pointer in the code below). All linked l
4 min read
Java Program to Reverse a Linked List Without Manipulating its Pointers Given a linked list, the task is to write a program in Java that reverses the linked list without manipulating its pointers, i.e., the reversal should happen just by changing the data values and not the links. ExamplesInput: Original linked list 1->2->3->4->5->nullOutput: Linked list
3 min read