430. 扁平化多级双向链表

429 阅读1分钟

题目介绍

力扣430题:leetcode-cn.com/problems/fl…

image.png

image.png

image.png

image.png

分析

根据题目的要求,我们要做的就是找到包含子链表的节点,将链表从此断开,接上子链表,接着将子链表的尾节点接上当前节点之前的下一个节点。具体如下图所示: image.png 迭代的处理节点顺序为:

image.png

但由于链表本身不存在环,「迭代」的构建顺序发生调整,仍然可以确保每个节点被访问的次数为常数次。

代码如下:

/*
// Definition for a Node.
class Node {
    public int val;
    public Node prev;
    public Node next;
    public Node child;
};
*/
class Solution {
    public Node flatten(Node head) {
        tranverse(head);
        return head;
    }

    public void tranverse(Node head) {
        if(head == null) {
            return;
        }
        while(head != null) {
            //找到有子链表的节点
            if(head.child != null) {
                //首先保存当前节点的下一个节点
                Node nextNode = head.next;
                //当前节点的next指针指向子节点
                head.next = head.child;
                //子节点的prev指针指向当前节点
                head.child.prev = head;
                //将当前节点的孩子节点指针置为空
                head.child = null;
                Node cur = head;
                //遍历当前节点下面的所有子节点,找到子节点链表的尾节点
                while(cur.next != null) {
                    cur = cur.next;
                }
                //子链表的尾节点指向当前节点之前的下一个节点
                cur.next = nextNode;
                if(nextNode != null) {
                    nextNode.prev = cur;
                }
            }
            head = head.next;     
        }   
    }
}