Problem: 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. You are given the head of the first level of the list. Flatten the list so that all the nodes appear in a single-level linked list. Flatten the list in way that all nodes at first level should come first, then nodes of second level, and so on.
Solution:
Follow the following steps:
- Take "curr" pointer pointing to head of the list.
- Take "tail" pointer pointing to end of the first level of the list
- Repeat the following steps until curr != tail
- if curr has child then:
- Append this child to the tail
- Make the tail points to the end of this child's list.
- Assign curr->next to curr.
Implementation:
//Structure of the node
struct Node
{
 Node *next;
 Node *child;
 int data;
 Node(int d, Node* n = 0, Node* c = 0):data(d), next(n), child(c){} 
};
void ListWithChild::flattenList()
{
 if(!head)
  return;
 Node *tail = head;
 while(tail->next)
  tail = tail->next;
 Node *curr = head;
 while(curr != tail)
 {
  if(curr->child)
  {
   tail->next = curr->child;
   while(tail->next)
    tail = tail->next;
  }
  curr = curr->next;
 }
}
Complexity: O(n)
 
 
No comments:
Post a Comment