您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。
扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。
示例:
输入:
1---2---3---4---5---6--NULL
|
7---8---9---10--NULL
|
11--12--NULL
输出:
1-2-3-7-8-11-12-9-10-4-5-6-NULL
以上示例的说明:
给出以下多级双向链表:

我们应该返回如下所示的扁平双向链表:

解法1:

public Node flatten(Node head) {
/*如果双向链表是空则返回空*/
if (head == null) {
return null;
}
/*展开双向链表*/
helper(head);
/*返回头节点*/
return first;
}
public void helper(Node node) {
/*当节点不为空时*/
while (node != null) {
/*尾节点不为空时,赋值尾节点的下一个节点是当前节点,当前节点的上一个节点是尾节点,当尾节点为null时,说明是初始化,赋值头节点为当前节点*/
if (last != null) {
last.next = node;
node.prev = last;
} else {
first = node;
}
/*尾节点赋值为当前节点*/
last = node;
/*当前节点的孩子节点不为空时,先暂存当前节点的下一个节点,递归遍历孩子节点,然后当前节点的孩子节点赋值为空,当前节点指向前面暂存的下一个节点*/
if (node.child != null) {
Node tmp = node.next;
helper(node.child);
node.child = null;
node = tmp;
} else {
/*当前节点指向下一个节点*/
node = node.next;
}
}
}
/**
* 定义一个尾节点
*/
private Node last;
/**
* 定义一个头节点
*/
private Node first;
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/flatten-a-multilevel-doubly-linked-list
