扁平化多级双向链表

您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,

依此类推,生成多级数据结构,如下面的示例所示。

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

示例:

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

思路:定义结点cur指向head,然后遍历链表,判断cur结点是否还有子节点,如果不含,cur指向cur的下一个结点,否则将该结点cur含有子结点那个子链表插入到主链表中,
并且让cur的子节点为空,cur指向cur下一个结点,继续重复上述过程,直到cur指向空。
代码如下:
这块需要注意的是将子链表插入时,要分情况,插入到结尾是一种情况,其他位置插入是一种情况,具体看代码
public Node flatten(Node head) {
        Node cur = head;
        while(cur!=null){
            if(cur.child!=null){
                Node child = cur.child;
                Node sign = child;
                while(child.next!=null){
                    child = child.next;
                }
                //结尾插入
                if(cur.next == null){
                    child.next = cur.next;
                    sign.prev = cur;
                    cur.next = sign;
                }else{
                    //非结尾插入
                    child.next = cur.next;
                    sign.prev = cur;
                    cur.next.prev = child;
                    cur.next = sign;
                }
                cur.child = null;
            }
            cur = cur.next;
        }
        return head;
    }

有关双向链表的一些基本实现给大家分享一个链接:

https://github.com/dukaichao/DataStructure/tree/master/doubleList

原文地址:https://www.cnblogs.com/du001011/p/10674882.html