扁平化多级双向链表

您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。

扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。

示例:

输入:
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;
View Code 

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/flatten-a-multilevel-doubly-linked-list

原文地址:https://www.cnblogs.com/wuyouwei/p/11826084.html