欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

每日一道Leetcode - 430. 扁平化多级双向链表

程序员文章站 2022-04-24 18:48:17
...

每日一道Leetcode - 430. 扁平化多级双向链表
参考了题解,理了下思路,本来还想着使用队列和栈,其实没有必要,因为他定义了三种不同类型的指针。
很巧妙的一个思路,遍历节点,父节点的子孩子不为空,就将当前子链表的前节点指向父节点,遍历子链表找到子链表的最后一个节点的后指针指向父节点本来的下一个节点。父节点的孩子节点也要设置为空,父节点本来的下一个节点也要设置prev指针指向前面的子链表找到的最后一个节点。

/*
// 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) {
        Node p = head;
        while(p!=null){
            if(p.child != null){
                // 孩子节点不为空
                // 记录每个节点的兄弟链表 next 以及孩子链表 child
                Node next = p.next;
                Node child = p.child;
                // 将当前节点的兄弟指针指向孩子,并且孩子指针设置为空
                p.next = child;
                p.child = null;
                // 设置孩子节点的前指针为父节点p
                child.prev = p;
                // 遍历孩子节点之后的链表,找到孩子链表节点的最后一个节点
                while(child.next!=null){
                    child = child.next;
                }
                // 孩子链表遇到null, 说明当前孩子链表节点的下一个指向父节点的兄弟链表
                child.next = next;
                // 因为next是卡断的,所以判断是否为空,不为空还要为他设置前指针指向当前孩子链表最后一个节点
                if(next!=null){
                    next.prev = child;
                }
            }
            // 孩子结点为空直接向后移
            // 上面的找到子链表操作之后也往后继续遍历找子链表处理
            p = p.next;
        }
        return head;
    }
}