您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。
扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。
示例:
输入:
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