题目链接
思路:DFS
分析:当节点的孩子节点不为空的时候,那么就要进入深度优先搜索,并且当前节点的下一个节点肯定是指向孩子节点,并且孩子节点那一串扁平化之后,最后一个的下一个肯定是指向当前节点的下一个;
代码:
/*
// Definition for a Node.
class Node {
public int val;
public Node prev;
public Node next;
public Node child;
};
*/
class Solution {
public Node flatten(Node head) {
Node p = head;
while(p!=null){
//如果孩子节点不为空,DFS操作
if(p.child!=null){
//记录当前节点的下一个节点
Node next = p.next;
//记录当前节点的孩子节点
Node child = p.child;
//当前节点的孩子节点断开,这是题目答案的要求
p.child = null;
//孩子节点的前置节点肯定是当前节点
child.prev = p;
//当前节点的下一个肯定是孩子节点,也就是说DFS返回的肯定是child
p.next = dfs(child,next);
}else{
p = p.next;
}
}
return head;
}
//这里的finished指的是孩子节点扁平化后最后一个节点指向的下一个节点
public Node dfs(Node node,Node finished){
Node p = node;
while(p.next!=null){
if(p.child!=null){
//同上操作
Node next = p.next;
Node child = p.child;
p.child = null;
child.prev = p;
p.next = dfs(child,next);
}else{
p = p.next;
}
}
//最后一个节点的下一个节点肯定是finished节点
//注意。这里要记得把最后一个节点的prev指针改一下
p.next = finished;
if(finished!=null){
finished.prev = p;
}
return node;
}
}