您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,
依此类推,生成多级数据结构,如下面的示例所示。
扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。
示例:
输入: 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