leetcode430. Flatten a Multilevel Doubly Linked List

You are given a doubly linked list, which contains nodes that have a next pointer, a previous pointer, and an additional child pointer. This child pointer may or may not point to a separate doubly linked list, also containing these special nodes. These child lists may have one or more children of their own, and so on, to produce a multilevel data structure as shown in the example below.

Given the head of the first level of the list, flatten the list so that all the nodes appear in a single-level, doubly linked list. Let curr be a node with a child list. The nodes in the child list should appear after curr and before curr.next in the flattened list.

Return the head of the flattened list. The nodes in the list must have all of their child pointers set to null.

你会得到一个双链表,其中包含的节点有一个下一个指针、一个前一个指针和一个额外的 子指针 。这个子指针可能指向一个单独的双向链表,也包含这些特殊的节点。这些子列表可以有一个或多个自己的子列表,以此类推,以生成如下面的示例所示的 多层数据结构 。

给定链表的头节点 head ,将链表 扁平化 ,以便所有节点都出现在单层双链表中。让 curr 是一个带有子列表的节点。子列表中的节点应该出现在扁平化列表中的 curr 之后 和 curr.next 之前 。

返回 扁平列表的 head 。列表中的节点必须将其 所有 子指针设置为 null 。

输入:head = 1,2,3,4,5,6,null,null,null,7,8,9,10,null,null,11,12

输出:1,2,3,7,8,11,12,9,10,4,5,6
解释:输入的多级列表如上图所示。

扁平化后的链表如下图:
遇到一个节点有 child 的

复制代码
优先把 child 挪到该节点的 next 上面
然后一口气找到这个 child 链的最末尾(不要管这条 child 链中间是否还有其他的节点存在 child 分支,先跳过,后面处理)
把该末尾节点跟前面开的口子接上

完成上面一轮, curr 指针向前挪动一步,继续处理以上三步,这样就能够把题目的意思给模拟出来,扁平化链表。

迭代法

python 复制代码
class Solution:
    def flatten(self, head: 'Node') -> 'Node':
        curr = head
        while curr:
            if curr.child:
                nex = curr.next
                child = curr.child

                # 遇到一个child,先在 curr 这里豁开一个口子,把child变成 next 的关系
                curr.next = child
                curr.child = None
                child.prev = curr

                # 找到当前这个child链的最末尾
                while child.next:
                    child = child.next
                # 把child的最末尾的节点,跟上面豁开的口子 nex 接上
                if nex:
                    nex.prev = child
                child.next = nex
            curr = curr.next
        return head
相关推荐
珠海西格电力6 小时前
零碳园区数据应用的具体场景有哪些?
大数据·人工智能·算法·架构·能源
geovindu6 小时前
CSharp: Dijkstra Algorithms
开发语言·后端·算法·c#
学逆向的6 小时前
汇编——位运算
开发语言·汇编·算法·网络安全
可编程芯片开发7 小时前
基于simulink的PEM燃料电池控制系统建模与仿真,对比PID,积分分离以及滑模控制器
算法
学究天人7 小时前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(卷2)
算法·数学建模·动态规划·图论·抽象代数·拓扑学
玛卡巴卡ldf8 小时前
【LeetCode 手撕算法】(细节知识点总结)
java·数据结构·算法·leetcode·力扣
wanzehongsheng8 小时前
零碳产业园光伏园区光伏电站追踪对比固定:发电增益技术边界分析
算法·光伏发电·光伏·零碳园区·太阳能追光·低碳环保·追踪电站
KobeSacre8 小时前
CyclicBarrier 源码
java·jvm·算法
手写码匠8 小时前
注意力机制全家桶:从 Multi-Head 到 GQA 再到 Flash Attention 的手写实现
人工智能·深度学习·算法·aigc
大鱼>9 小时前
模型公平性与偏差检测:AI伦理实战指南
人工智能·深度学习·算法·机器学习