- 当我们遍历到某个节点node时,如果它的child存在,那么我们将child指向的链表结构进行扁平化,并且插入node与node的下一个节点之间。
- 所以,我们在遇到child成员存在的节点时,就要优先处理child指向的链表结构,这就是一个
深度优先搜索的过程。当我们完成对child指向的链表结构的扁平化之后,就可以回溯到node节点。 - 为了能够将扁平化的链表插入node与node的下一个节点之间,我们需要直到扁平化的链表的最后一个节点last,随后进行如下的三步操作:
- 将node与node的下一个节点next断开
- 将node与child相连
- 将last与next相连
就这样,我们就可以将扁平化的链表成功地插入
代码实现
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;
};
流程图分析