430 扁平化多级双向链表-中等

题目:

你会得到一个双链表,其中包含的节点有一个下一个指针、一个前一个指针和一个额外的 子指针 。这个子指针可能指向一个单独的双向链表,也包含这些特殊的节点。这些子列表可以有一个或多个自己的子列表,以此类推,以生成如下面的示例所示的 多层数据结构

给定链表的头节点 head ,将链表 扁平化 ,以便所有节点都出现在单层双链表中。让 curr 是一个带有子列表的节点。子列表中的节点应该出现在扁平化列表中的 curr 之后curr.next 之前

返回 扁平列表的 head 。列表中的节点必须将其 所有 子指针设置为 null

分析:

深度优先搜索

// date 2023/10/17
/**
 * Definition for a Node.
 * type Node struct {
 *     Val int
 *     Prev *Node
 *     Next *Node
 *     Child *Node
 * }
 */

func flatten(root *Node) *Node {
    dfs(root)
    return root
}

func dfs(root *Node) (last *Node) {
    cur := root
    for cur != nil {
        next := cur.Next
        if cur.Child != nil {
            chdRes := dfs(cur.Child)

            next = cur.Next  // save next

            // change cur Next to Child
            cur.Next = cur.Child
            cur.Child.Prev = cur

            if next != nil {
                chdRes.Next = next
                next.Prev = chdRes
            }

            cur.Child = nil
            last = chdRes
        } else {
            last = cur
        }

        // 遍历 next
        cur = next
    }
    return
}

最后更新于