剑指 Offer II 028. 展平多级双向链表

109 阅读1分钟

剑指 Offer II 028. 展平多级双向链表

  • 当我们遍历到某个节点node时,如果它的child存在,那么我们将child指向的链表结构进行扁平化,并且插入node与node的下一个节点之间。
  • 所以,我们在遇到child成员存在的节点时,就要优先处理child指向的链表结构,这就是一个 深度优先搜索的过程。当我们完成对child指向的链表结构的扁平化之后,就可以回溯到node节点。
  • 为了能够将扁平化的链表插入node与node的下一个节点之间,我们需要直到扁平化的链表的最后一个节点last,随后进行如下的三步操作:
  1. 将node与node的下一个节点next断开
  2. 将node与child相连
  3. 将last与next相连

就这样,我们就可以将扁平化的链表成功地插入

image.png

代码实现

var flatten = function (head) {
  const dfs = (node) => {
    let cur = node;
    let last = null;
    while (cur) {
      let next = cur.next;
      if (cur.child) {
        const childLast = dfs(cur.child);
        next = cur.next;
        cur.next = cur.child;
        cur.child.prev = cur;
        if (next != null) {
          childLast.next = next;
          next.prev = childLast;
        }
        cur.child = null;
        last = childLast;
      } else {
        last = cur;
      }
      cur = next;
    }
    return last;
  };
  dfs(head);
  return head;
};

流程图分析

image.png