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