C++ Program To Flatten A Multi-Level Linked List Depth Wise- Set 2
Last Updated :
17 Aug, 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.
C++
// C++ program to flatten a multilevel
// linked list
#include <bits/stdc++.h>
using namespace std;
// A Linked List Node
struct Node
{
int data;
struct Node *next;
struct Node *down;
};
// Flattens a multi-level linked
// list depth wise
Node* flattenList(Node* node)
{
// Base case
if (node == NULL)
return NULL;
// To keep track of last visited node
// (NOTE: This is static)
static Node *last;
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)
node->next = flattenList(node->down);
// If next exists, add it after the next
// of last added node
if (next)
last->next = flattenList(next);
return node;
}
// Utility method to print a
// linked list
void printFlattenNodes(Node* head)
{
while (head)
{
printf("%d ", head->data);
head = head->next;
}
}
// Utility function to create a
// new node
Node* newNode(int new_data)
{
Node* new_node = new Node;
new_node->data = new_data;
new_node->next = new_node->down = NULL;
return new_node;
}
// Driver code
int main()
{
// Creating above example list
Node* head = newNode(1);
head->next = newNode(2);
head->next->next = newNode(3);
head->next->next->next = newNode(4);
head->next->down = newNode(7);
head->next->down->down = newNode(9);
head->next->down->down->down =
newNode(14);
head->next->down->down->down->down =
newNode(15);
head->next->down->down->down->down->next =
newNode(23);
head->next->down->down->down->down->next->down =
newNode(24);
head->next->down->next = newNode(8);
head->next->down->next->down = newNode(16);
head->next->down->next->down->down =
newNode(17);
head->next->down->next->down->down->next =
newNode(18);
head->next->down->next->down->down->next->next =
newNode(19);
head->next->down->next->down->down->next->next->next =
newNode(20);
head->next->down->next->down->down->next->next->next->down =
newNode(21);
head->next->down->next->next = newNode(10);
head->next->down->next->next->down = newNode(11);
head->next->down->next->next->next = newNode(12);
// Flatten list and print modified list
head = flattenList(head);
printFlattenNodes(head);
return 0;
}
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 number of nodes in the linked list. This is because the algorithm visits every node once, making a single pass through the linked list.
Space complexity : O(1)
Alternate implementation using the stack data structure
C++
Node* flattenList2(Node* head)
{
Node* headcop = head;
stack<Node*> save;
save.push(head);
Node* prev = NULL;
while (!save.empty())
{
Node* temp = save.top();
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;
}
Please refer complete article on Flatten a multi-level linked list | Set 2 (Depth wise) for more details!
Similar Reads
C++ Program For Writing A Function To Delete A Linked List Algorithm For C++:Iterate through the linked list and delete all the nodes one by one. The main point here is not to access the next of the current pointer if the current pointer is deleted. Implementation: C++ // C++ program to delete a linked list #include <bits/stdc++.h> using namespace std
2 min read
C++ 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
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 appr
9 min read
C++ Program To Delete Alternate Nodes Of A Linked List Given a Singly Linked List, starting from the second node delete all alternate nodes of it. For example, if the given linked list is 1->2->3->4->5 then your function should convert it to 1->3->5, and if the given linked list is 1->2->3->4 then convert it to 1->3. Recomm
3 min read
C++ Program for Deleting a Node in a Linked List Write a C++ program to delete a node from the given link list.ExamplesInput: Linked List: 10 -> 20 -> 30 -> 40 -> 50, Position to delete: 3Output: 10 -> 20 -> 40 -> 50Explanation: The node at position 3 is removed. The list then connects node 20 directly to node 40.Input: Linked
6 min read