zoukankan      html  css  js  c++  java
  • 430#扁平化多级双向链表

    题目描述

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

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

    示例:

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

    以上示例的说明:

    给出以下多级双向链表:

    我们应该返回如下所示的扁平双向链表:


    分析

    乍一看这题,感觉和最近刚看的图的深度优先搜索(DFS)有点相似,应该可以用迭代的方法解决。从易到难,我们一点点分析不同的情况。

    1. 原链表为空

      这是最简单最基本的情况,直接返回null就可以了。

    2. 原链表没有child节点
      这在原来的基础上增加了一点条件,相当于原链表就是一个双向链表。在这种情况下,我们再细分成两种情况:

      • 如果当前指针没有后续节点了,就返回当前指针
      • 如果当前指针还有后续节点,就把后续节点作为参数迭代

      这样处理后,返回的结果是这条无child节点的双向链表的最后一个节点。

    3. 原链表有child节点
      这是这个处理流程的关键部分了。
      首先新建两个指针childnext分别记录当前指针的child节点和next节点。将当前指针的后续节点设为child指针(双向链接),且要将当前指针的child节点置为null,以防后续处理出错。再把child指针作为参数迭代,找到它的最后一个节点,记为childtail。最后判断当前指针后续是否还有节点(next是否为空),如果非空,就要在childtailnext之间建立双向链接,并返回next作为参数的迭代结果。

    这样一通操作后,原来链表的结构已经被改变了,我们再返回头节点head即可。

    作者:有空的话把示意图补上

    源码

    /*
    // Definition for a Node.
    class Node {
        public int val;
        public Node prev;
        public Node next;
        public Node child;
    
        public Node() {}
    
        public Node(int _val,Node _prev,Node _next,Node _child) {
            val = _val;
            prev = _prev;
            next = _next;
            child = _child;
        }
    };
    */
    class Solution {
        public Node flatten(Node head) {
        	flattentail(head);
        	return head;
        }
    
        private Node flattentail(Node head) {
        	if (head == null) return head; 
        	if (head.child == null) {
        		if (head.next == null) return head; 
        		return flattentail(head.next); 
        	}
        	else {
                Node child = head.child;
                Node next = head.next;
                head.next = child;
                child.prev = head;
                head.child = null;
                Node childtail = flattentail(child);
                if (next != null){
                    childtail.next = next;
                    next.prev = childtail;
                    return flattentail(next);
                }
                 return childtail;
        	}	   	
           
        }
    }
    
  • 相关阅读:
    vue 兼容ie 下载文件
    IDEA maven项目添加自己的jar包依赖
    mongodb 用户权限操作
    springboot + aspect
    Enum枚举类
    线上CPU飙升100%问题排查
    Linux零拷贝技术
    Java线程池实现原理及其在美团业务中的实践
    深入解析String#intern
    Java对象内存布局
  • 原文地址:https://www.cnblogs.com/yuzhenzero/p/9630620.html
Copyright © 2011-2022 走看看