Flatten a Linked List with Child Pointers in Go

Program Code


package main

import "fmt"

// Node defines a node in a multi-level linked list with child pointers
type Node struct {
    Val    int
    Next   *Node
    Child  *Node
}

// flatten flattens a multi-level linked list into a single-level linked list
func flatten(head *Node) *Node {
    if head == nil {
        return nil
    }

    dummy := &Node{}
    current := dummy
    stack := []*Node{head}

    for len(stack) > 0 {
        node := stack[len(stack)-1]
        stack = stack[:len(stack)-1]

        current.Next = node
        current = current.Next

        if node.Next != nil {
            stack = append(stack, node.Next)
        }
        if node.Child != nil {
            stack = append(stack, node.Child)
            node.Child = nil
        }
    }

    return dummy.Next
}

// Helper function to print the linked list
func printList(head *Node) {
    for head != nil {
        fmt.Print(head.Val, " ")
        head = head.Next
    }
    fmt.Println()
}

// Main function to test the flatten function
func main() {
    // Create a multi-level linked list
    // List: 1 -> 2 -> 3 -> 4 -> 5 -> 6
    // Child of 3: 7 -> 8 -> 9
    // Child of 8: 10 -> 11
    // Child of 9: 12

    // Create child lists
    child3 := &Node{7, &Node{8, &Node{9, &Node{12, nil}}}}
    child8 := &Node{10, &Node{11, nil}}

    // Create main list with children
    head := &Node{1, &Node{2, &Node{3, &Node{4, &Node{5, &Node{6, nil}}}}}}
    head.Next.Next.Child = child3
    child3.Next.Child = child8

    fmt.Print("Original List: ")
    printList(head)

    // Flatten the multi-level linked list
    flattened := flatten(head)

    fmt.Print("Flattened List: ")
    printList(flattened)
}
    

Explanation

The Go program is designed to flatten a multi-level linked list into a single-level linked list. Here is a detailed explanation of the program structure:

1. Node Definition

The Node struct defines a node in a multi-level linked list. Each node contains:

  • Val: The value of the node.
  • Next: A pointer to the next node in the same level.
  • Child: A pointer to a child node (which itself may have its own next and child nodes).

2. flatten Function

The flatten function flattens the multi-level linked list:

  • Initializes a dummy node and a stack to help with the traversal.
  • Uses a stack to perform a depth-first traversal of the linked list:
    • Pops the top node from the stack and appends it to the current node’s next pointer.
    • If the node has a next pointer, pushes it onto the stack.
    • If the node has a child pointer, pushes it onto the stack and sets the child pointer to nil.
  • Returns the flattened list starting from the dummy node’s next pointer.

3. printList Function

The printList function is a utility to print out the values of the linked list for demonstration purposes.

4. Main Function

The main function demonstrates the usage of the flatten function:

  • Creates a sample multi-level linked list with child pointers.
  • Prints the original multi-level linked list.
  • Flattens the list using flatten and prints the result.

 

By Aditya Bhuyan

I work as a cloud specialist. In addition to being an architect and SRE specialist, I work as a cloud engineer and developer. I have assisted my clients in converting their antiquated programmes into contemporary microservices that operate on various cloud computing platforms such as AWS, GCP, Azure, or VMware Tanzu, as well as orchestration systems such as Docker Swarm or Kubernetes. For over twenty years, I have been employed in the IT sector as a Java developer, J2EE architect, scrum master, and instructor. I write about Cloud Native and Cloud often. Bangalore, India is where my family and I call home. I maintain my physical and mental fitness by doing a lot of yoga and meditation.

Leave a Reply

Your email address will not be published. Required fields are marked *

error

Enjoy this blog? Please spread the word :)