📜  Java程序展平多级链表深度明智集 2

📅  最后修改于: 2022-05-13 01:57:43.895000             🧑  作者: Mango

Java程序展平多级链表深度明智集 2

我们已经讨论了多级链表的扁平化,其中节点有两个指针 down 和 next。在上一篇文章中,我们将链表逐层展平。当我们总是需要在每个节点的 next 之前处理向下指针时,如何展平链表。

Input:  
1 - 2 - 3 - 4
    |
    7 -  8 - 10 - 12
    |    |    |
    9    16   11
    |    |
    14   17 - 18 - 19 - 20
    |                    |
    15 - 23             21
         |
         24

Output:        
Linked List to be flattened to
1 - 2 - 7 - 9 - 14 - 15 - 23 - 24 - 8
 - 16 - 17 - 18 - 19 - 20 - 21 - 10 - 
11 - 12 - 3 - 4
Note: 9 appears before 8 (When we are 
at a node, we process down pointer before 
right pointer)

资料来源:甲骨文采访

如果我们仔细观察,我们会注意到这个问题类似于树到链表的转换。我们通过以下步骤递归地展平一个链表:

  1. 如果节点为 NULL,则返回 NULL。
  2. 存储当前节点的下一个节点(在步骤 4 中使用)。
  3. 递归地展平列表。在展平时,跟踪最后访问的节点,以便在它之后链接下一个列表。
  4. 递归地展平下一个列表(我们从步骤 2 中存储的指针获取下一个列表)并将其附加到最后访问的节点之后。

下面是上述思想的实现。

Java
// Java program to flatten a multilevel 
// linked list
public class FlattenList 
{
    static Node last;
  
    // Flattens a multi-level linked 
    // list depth wise 
    public static Node flattenList(Node node)
    {
        if(node==null) 
            return null; 
    
        // To keep track of last visited node 
        // (NOTE: This is static)  
        last = node; 
    
        // Store next pointer 
        Node next = node.next; 
    
        // If down list exists, process it 
        // first. Add down list as next of 
        // current node 
        if(node.down!=null) 
            node.next = flattenList(node.down); 
    
        // If next exists, add it after the
        // next of last added node 
        if(next!=null) 
            last.next = flattenList(next); 
    
        return node; 
    }
  
    // Utility method to print a linked list
    public static void printFlattenNodes(Node head) 
    { 
        Node curr=head;
        while(curr!=null) 
        { 
            System.out.print(curr.data+" ");
            curr = curr.next;
        } 
          
    } 
      
    // Utility function to create a 
    // new node 
    public static Node push(int newData) 
    { 
        Node newNode = new Node(newData); 
        newNode.next =null; 
        newNode.down = null; 
        return newNode; 
    } 
      
    // Driver code
    public static void main(String args[]) 
    {
        Node head=new Node(1);
        head.next = new Node(2); 
        head.next.next = new Node(3); 
        head.next.next.next = new Node(4); 
        head.next.down = new Node(7); 
        head.next.down.down = new Node(9); 
        head.next.down.down.down = new Node(14); 
        head.next.down.down.down.down = 
        new Node(15); 
        head.next.down.down.down.down.next = 
        new Node(23); 
        head.next.down.down.down.down.next.down = 
        new Node(24); 
        head.next.down.next = new Node(8); 
        head.next.down.next.down = new Node(16); 
        head.next.down.next.down.down= new Node(17); 
        head.next.down.next.down.down.next= 
        new Node(18); 
        head.next.down.next.down.down.next.next = 
        new Node(19); 
        head.next.down.next.down.down.next.next.next = 
        new Node(20); 
        head.next.down.next.down.down.next.next.next.down = 
        new Node(21); 
        head.next.down.next.next = new Node(10); 
        head.next.down.next.next.down = new Node(11); 
        head.next.down.next.next.next = new Node(12); 
        head = flattenList(head); 
        printFlattenNodes(head);
    }
}
  
// Node of Multi-level Linked List
class Node
{
    int data;
    Node next,down;
    Node(int data)
    {
        this.data=data;
        next=null;
        down=null;
    }
}
//This code is contributed by Gaurav Tiwari


Java
Node flattenList2(Node head)
{
    Node headcop = head;
    Stack save = new Stack<>();
    save.push(head);
    Node prev = null;
  
    while (!save.isEmpty()) {
        Node temp = save.peek();
        save.pop();
  
        if (temp.next)
            save.push(temp.next);
        if (temp.down)
            save.push(temp.down);
  
        if (prev != null)
            prev.next = temp;
  
        prev = temp;
    }
    return headcop;
}
// This code is contributed by aashish1995


输出:

1 2 7 9 14 15 23 24 8 16 17 18 19 20 21 10 11 12 3 4

使用堆栈数据结构的替代实现

Java

Node flattenList2(Node head)
{
    Node headcop = head;
    Stack save = new Stack<>();
    save.push(head);
    Node prev = null;
  
    while (!save.isEmpty()) {
        Node temp = save.peek();
        save.pop();
  
        if (temp.next)
            save.push(temp.next);
        if (temp.down)
            save.push(temp.down);
  
        if (prev != null)
            prev.next = temp;
  
        prev = temp;
    }
    return headcop;
}
// This code is contributed by aashish1995 


请参考关于扁平化多级链表的完整文章 | Set 2 (Depth wise) 了解更多详情!