扁平化双向链表
思路:
1)递归
先保存有child的节点的下一个,改变当前节点next指向child,并令该结点的child=null,递归找到下一层的最后一个,如果当前节点(有child的节点)的temp.next!=null,就让最后一个节点last指向temp.next
2)循环
需要另一个指针(chi)指向当前节点cur的child节点,然后移动chi指向最后一个,如果cur.next!=null,就把chi指向cur.next。
同时需要把cur的next指向cur.child,然后把cur.child=null。就像是把下一层的链表头尾插入到上一层的链表中。其中,因为改变了cur的next使其指向了child,这样下一次循环的时候cur就会指向下一层开始节点。
class Solution {
//递归
public Node flatten(Node head) {
f(head);
return head;
}
public Node f(Node head) {
if(head==null)
return head;
//指针
Node temp=head;
//最后一个
Node end=temp;
while(temp!=null) {
//有child
if(temp.child!=null) {
//保存有child的下一个
Node next=temp.next;
//改变有child的next和child的prev
temp.next=temp.child;
temp.child.prev=temp;
temp.child=null;
Node last=f(temp.next);
//递归一层结束返回本层最后一个
//如果保存的下一个不为null,让last指向next
if(next!=null) {
last.next=next;
next.prev=last;
} else
return last;
}
end=temp;
temp=temp.next;
}
//返回本层最后一个
return end;
}
//循环
public Node flatten(Node head) {
Node cur=head;
while(cur!=null) {
if(cur.child!=null) {
//指向child用于保存
Node chi=cur.child;
//找到最后一个chi
while(chi.next!=null)
chi=chi.next;
//如果当前下一个不为null
if(cur.next!=null) {
//最后一个chi指向当前下一个
chi.next=cur.next;
cur.next.prev=chi;
}
//把当前指向child
cur.next=cur.child;
cur.child.prev=cur;
//把当前的child置为null
cur.child=null;
}
//因为当前next指向了child,所以下一次循环cur
//就指向了下一层的child
cur=cur.next;
}
return head;
}
}
class Node {
public int val;
public Node prev;
public Node next;
public Node child;
}