• 扁平化多级双向链表


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

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

    示例:

    输入:
    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

  • 相关阅读:
    Android 系统日期时间的获取
    Android What is Application
    Android 所有颜色代码
    Android onNewIntent
    Android Activity管理类
    Android 应用启动渐变效果
    算法的的代价及其度量
    算法的设计与分析
    算法的描述
    数据结构与算法(python版)教程
  • 原文地址:https://www.cnblogs.com/wuyouwei/p/11826084.html
Copyright © 2020-2023  润新知