随笔-扁平化多级双向链表

版权声明:中华人民共和国持有版权 https://blog.csdn.net/Fly_Fly_Zhang/article/details/85683919

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

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

示例:

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

思路:我们只看两级链表,其实本质就是遇见child 将child这条链表插入cur 和 cur.next之间 ,只不过需要注意的是链表有前驱;每次节点变化都需要重新设置前驱;再有一点需要注意的就是cur.next为空的边界条件,这个就需要判断一下。

/*
// 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) {
        if(head==null || head.next==null&&head.child==null){
            return head;
        }
        Node cur=head;
        Node pre;
        Node cur1;
        Node child;
        while(cur!=null){
            if(cur.child!=null){
                child=cur.child; //孩子链头
                pre=cur.next; //主链的下一节点
                cur.next=child; //主链的下一节点为孩子
                child.prev=cur; //新的下一节点的前驱绑定主链前一节点
                cur.child=null; //已经拼接到主链,孩子链置为空;
                if(pre==null){
                    continue;
                }
                while(child.next!=null){//找到新主链的下一节点
                    child=child.next;
                }
                child.next=pre;//连接以前的主链
                   pre.prev=child; 
            }
            cur=cur.next;
        }
        return head;
    }
}

猜你喜欢

转载自blog.csdn.net/Fly_Fly_Zhang/article/details/85683919
今日推荐