[路飞]扁平化多级双向链表

72 阅读1分钟

记录 1 道算法题

扁平化多级双向链表

leetcode.cn/problems/fl…


要求:双向链表中的 child 有可能指向另一个双向链表,将双向链表扁平化,child 插入到当前节点和当前节点的下一个节点之间。

像数组扁平化一样递归处理即可,由于是双向链表,注意 prev 和 next 的重新指向。

完整代码如下:

    function flatten(head) {
        const f = (node) => {
            if (!node) return node
            // 保存最后一个非空节点
            let last = null
            while(node) {
                if (node.chlid) {
                    // 有子链表递归处理,返回链表最后一个节点
                    const end = f(node.child)
                    // 当前如果是最后一个节点就不需要做尾部的衔接
                    if (node.next && end) {
                        end.next = node.next
                        node.next.prev = end
                    }
                    
                    // 衔接头部
                    node.next = node.child
                    node.child.prev = node
                    node.child = null
                    // 移动指针
                    last = end
                    node = end.next
                } else {
                    // 移动指针
                    last = node
                    node = node.next
                }
            }
            
            return last
        }
        
        f(head)
        return head
    }