LeetCode - 430 - 扁平化多级双向链表 - Java - 细喔


[](()题目解析

===================================================================

在这里插入图片描述

总的来说 :就是遍历一个链表,如果 child 为 null,则继续遍历下一个节点,但如果 child 不为 null,也就是说中止当前链表遍历,遍历 当前节点的child 所在链表,那么下一次遍历的节点就是从child指向的节点开始(并插入到当前链表节点的next位置),直到遍历完 child 所在的链表所有节点(前提是 child 所在的链表的所有节点 的child 都为 null,否则,按照前面说的,中止遍历当前链表,优先遍历完 child 所在链表)。遍历完后,继续上部分还未遍历完的链表(插入完child所在链表的所有节点,将其尾巴节点,接回原先链表中,继续遍历上部分链表未遍历的部分)。【遍历的过程,包含链接。】


[](()第一步:创建一个方法 pancake - 偏平化,来实现我们所有的操作。


在这里插入图片描述


[](()第二步: 实现 pancake 方法


[](()创建一个替身变量cur,来遍历数组,再创建一个 last 来记录链表最终结果的最后一个节点位置。

![在这里插入图片描述](https://img-blog.csdnimg.cn/88a91f23bf2a40edbbce38cd6f8b267b.png 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 ?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_16,color_FFFFFF,t_70,g_se,x_16)

因为我们无法确定该链表中所有节点 的 child 是否为 null,或者 child 所在链表的节点总数,所以一开始是无法确定 最后结果的节点位置。


[](()接下来,我们就要遍历链表。

在这里插入图片描述


[](()进入循环,此时,cur指向第一个节点位置,但是,正如我们前面所有说:我们无法确定 所有节点 child 为 null,还是补位null。所以我们就需要进行判断 : 此时cur指向的节点child 是否 为 null。

如果是,我们就需要记录 cur 的 next 值。(当然提前创建一个变量来记录)

方便 最后将 child 所在链表 的所有节点 插入 上部分链表时,收尾部分(将child所在链表的尾结点,上部分中断的位子,进行链接,从而真正接入原先链表中)

在这里插入图片描述


[](()接下来,就是重点! ( 递归 )

在这里插入图片描述

这里,我使用递归思想。来看!

在这里插入图片描述


在这里插入图片描述

然后我们就需要去思考:这个递归的终止条件是 cur,child == null,对不对?

来想一想:在递归结束的时候,我们继续遍历当前递归到child所在链表,直到遍历完当前链表的所有节点,如果当前链表中的节点还存在 child,无非,就是在递归一次,然后就跟我们现在一样,就需遍历当前链表。

在此过程 last 永远指向都是 当前链表中最后一个节点。(也就是child 的 尾巴节点)

而我们,要将child 所在链表的节点全部插入进来,就需要最后一个节点的位置。

在这里插入图片描述

在这里插入图片描述


[](()然后就是正式 处理 开头 和 收尾问题。

在这里插入图片描述


[](()接下来就是冲上述操作

在这里插入图片描述

你可以比较一下.

在这里插入图片描述


[](()附上代码

===================================================================

/*

// Definition for a Node.

class Node {

public int val;

public Node prev;

public Node next;

public Node child;

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值