leetcode 展平多级双向链表

题目链接
思路: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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值