[路飞]_关于链表扁平化

179 阅读1分钟

今天刷到了一道个人感觉有趣的链表题,废话不多说直接贴链接

430. 扁平化多级双向链表

这道题应该是扁平化多维数组差不多的意思,但是由于此题目链表结构的特殊性,需要特别处理child跟prev指针所指向的节点,

image.png

image.png 题目提供了这个例子,这样看可能还有些懵懂,我简化了一些结构图

image.png 我这样解释一下,这个图中所需要注意的结点,首先循环走到 3结点的时候要先处理箭头向下的结点 也就是题目中所说的child,其次在处理双向指针的结点

image.png 最终处理成这样即可
通过👀,看到一个用栈的特性来解的,巧妙程度都具有可观赏性
怎么利用stack来解呢,其实就是利用栈的先进后出道特性来实现的,比如说结点走到3这里,我先将4推入栈中,7后推入栈中,那是不是先处理了7结点,那又因为7结点后面还有很多结点,需要依次推入栈中,那么4结点是不是就在剩下结点处理完后,再去弹出进行处理


上动图康康整体流程

扁平化二叉树.gif

var flatten = function(head) {
    if(!head){
        return head
    }
    //创建新链表
    let newNodeList = new Node(-1,null,null,null)
    let prev = newNodeList
    let stack = [head]
    while(stack.length){
        let cur = stack.pop()
        prev.next = cur
        cur.prev = prev
        //先进后出,所以先推入next结点
        if(cur && cur.next){
            stack.push(cur.next)
        }
        if(cur && cur.child){
            stack.push(cur.child)
            cur.child= null
        }
        prev = cur
    }
    newNodeList.next.prev = null;
    return newNodeList.next
};