Leetcode 题解(每日打卡)
[430. 扁平化多级双向链表]
题目描述
多级双向链表中,除了指向下一个节点和前一个节点指针之外,它还有一个子链表指针,可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。
给你位于列表第一级的头节点,请你扁平化列表,使所有结点出现在单级双链表中。
思路一
将多级双向链表转换成单级双链表,我们可以对每个节点进行检查,如果该结点有child就把next指向该孩子结点并一直遍历下去,当遍历完整个孩子结点及其子结点之后,再将之前结点的下一个结点链上去,这里我们维护了一个栈空间,用于记录结点的状态。
思路二
将该多级双链表看做一个二叉树,孩子结点是左子树,next结点为右子树,结果就是其前序遍历的结果,并创建一个双链表去存储遍历出来的结果。
代码实现
/*
// Definition for a Node.
class Node {
public int val;
public Node prev;
public Node next;
public Node child;
};
*/
class Solution {
public Node flatten(Node head) {
Node cur = new Node();
Node t;
Node h = head;
if(head != null){
while(h.next != null || h.child != null || cur.prev != null){
if(h.child != null){
if(h.next != null){
h.next.prev = cur;
cur = h.next;
}
h.next = h.child;
h.child.prev = h;
h.child = null;
}
h = h.next;
if(h.next == null && cur.prev != null){
h.next = cur;
t = cur.prev;
cur.prev = h;
cur = t;
}
}
}
return head;
}
}
时间复杂度: O(n)