今天刷到了一道个人感觉有趣的链表题,废话不多说直接贴链接
430. 扁平化多级双向链表
这道题应该是扁平化多维数组差不多的意思,但是由于此题目链表结构的特殊性,需要特别处理child跟prev指针所指向的节点,
题目提供了这个例子,这样看可能还有些懵懂,我简化了一些结构图
我这样解释一下,这个图中所需要注意的结点,首先循环走到 3结点的时候要先处理箭头向下的结点 也就是题目中所说的child,其次在处理双向指针的结点
最终处理成这样即可
通过👀,看到一个用栈的特性来解的,巧妙程度都具有可观赏性
怎么利用stack来解呢,其实就是利用栈的先进后出道特性来实现的,比如说结点走到3这里,我先将4推入栈中,7后推入栈中,那是不是先处理了7结点,那又因为7结点后面还有很多结点,需要依次推入栈中,那么4结点是不是就在剩下结点处理完后,再去弹出进行处理
上动图康康整体流程
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
};