记录 1 道算法题
扁平化多级双向链表
要求:双向链表中的 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
}