-
题目:
多级双向链表中,除了指向下一个节点和前一个节点指针之外,它还有一个子链表指针,可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。 给你位于列表第一级的头节点,请你扁平化列表,使所有结点出现在单级双链表中。
-
示例 1:
输入:head = [1,2,3,4,5,6,null,null,null,7,8,9,10,null,null,11,12] 输出:[1,2,3,7,8,11,12,9,10,4,5,6] 解释:
-
输入的多级列表如下图所示:
-
扁平化后的链表如下图:
-
-
示例 2:
输入:n = 0输入:head = [1,2,null,3] 输出:[1,3,2] 解释: 输入的多级列表如下图所示: 1---2---NULL | 3---NULL 输出:false
-
示例三
输入:head = [] 输出:[]
-
提示
- 节点数目不超过 1000
- 1 <= Node.val <= 10^5
思路 :
- 深度搜索直接解决。遇到有子项的就进入。将子项的头接到next中,原本的next接到子项的后面
示例一:
public Node flatten(Node head) {
dfs(head);
return head;
}
private Node dfs(Node node) {
// 指针
Node p = node;
// 最后一个节点
Node lastNode = node;
while (p != null) {
if (p.child != null) {
Node next = p.next;
p.next = p.child;
p.next.prev = p;
p.child = null;
Node n = dfs(p.next);
if (next != null) {
n.next = next;
next.prev = n;
}
lastNode = n;
p = next;
} else {
lastNode = p;
p = p.next;
}
}
return lastNode;
}