【问题标题】:Flatten a Multilevel Doubly Linked List leetcode扁平化多级双向链表 leetcode
【发布时间】:2021-10-27 23:04:41
【问题描述】:

给你一个双向链表,除了 next 和 previous 指针之外,它可能有一个子指针,它可能指向也可能不指向单独的双向链表。这些子列表可能有自己的一个或多个子列表,依此类推,以生成多级数据结构,如下例所示。

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

class Solution {
/*Global variable pre to track the last node we visited */
    Node pre = null;
    public Node flatten(Node head) {
        if (head == null) {
            return null; 
        }
/*Connect last visted node with current node */
        if (pre != null) {
            pre.next = head; 
            head.prev = pre;
        }

        pre = head; 
/*Store head.next in a next pointer in case recursive call to flatten head.child overrides head.next*/
        Node next = head.next; 

        flatten(head.child);
        head.child = null;

        flatten(next);        
        return head; 
    }
}

对于这个问题,上面的 leetcode 解决方案有效。但我不明白这一点:

/*Store head.next in a next pointer in case recursive call to flatten head.child overrides head.next*/
        Node next = head.next;

谁能解释这部分? head.child 是如何覆盖 head.next 的?

【问题讨论】:

    标签: java data-structures linked-list


    【解决方案1】:

    flatten(head.child) 可能会因我们将上次访问的节点与当前节点连接的部分而改变head.next

    if (pre != null) {
      pre.next = head; 
      head.prev = pre;
    }
    

    在这个阶段,pre 代表旧的headhead 代表head.child。所以我们实际上将我们的head 与它的child 连接起来。但是如果这样做,我们将失去与实际head.next 的连接,因此我们必须将其保存在一个名为next 的额外变量中。这就是我们在调用flatten() 函数之前保留它的原因。

    【讨论】:

      猜你喜欢
      • 2019-04-23
      • 1970-01-01
      • 2016-01-14
      • 2014-08-21
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多