LeetCode 430:扁平化多级双向链表 Flatten a Multilevel Doubly Linked List
您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。
扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。
You are given a doubly linked list which in addition to the next and previous pointers, it could have a child pointer, which may or may not point to a separate doubly linked list. 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.
Flatten the list so that all the nodes appear in a single-level, doubly linked list. You are given the head of the first level of the list.
示例:
输入:
1---2---3---4---5---6--NULL
|
7---8---9---10--NULL
|
11--12--NULL
输出:
1-2-3-7-8-11-12-9-10-4-5-6-NULL
以上示例的说明:
给出以下多级双向链表:

我们应该返回如下所示的扁平双向链表:

解题思路:
这道题是典型的 DFS(深度优先搜索)型例题,并且给出了图解,只要了解过 DFS 的应该立即就能想到思路。
针对这道题简单说下:深度优先搜索 就像一棵树(二叉树)的前序遍历,从某个顶点(链表头节点)出发,自顶向下遍历,然后遇到顶点的未被访问的邻接点(子节点 Child),继续进行深度优先遍历,重复上述过程(递归),直到所有顶点都被访问为止。
其逻辑以示例输入为例:
1---2---3---4---5---6--NULL
|
7---8---9---10--NULL
|
11---12---NULL
从节点 1 开始遍历,当前遍历链表为:1---2---3---4---5---6--NULL
遇到邻接点 2,其子链表为:7---8---9---10--NULL
将子链表头节点 7 作为参数传入 DFS 函数,当前遍历链表为:7---8---9---10---NULL
继续遍历,遇到邻接点 8,其子链表为:11--12--NULL
将子链表头节点 8 作为参数传入 DFS 函数,当前遍历链表为:11--12---NULL
继续遍历,无邻接点,遍历结束,返回当前链表尾节点 12
改变邻接点 8 与子链表头节点 11 关系:7---8---11---12
连接返回值 尾节点 12 和邻接点的下一个节点 9: 7---8---11---12---9---10---NULL
继续遍历,无邻接点,遍历结束,返回当前链表尾节点 10
改变邻接点 2 与 子链表头节点 7 关系:1---2---7---8---11---12---9---10--NULL
连接返回值 尾节点 10 和邻接点的下一个节点 3: 1---2---7---8---11---12---9---10---3---4---5---6--NULL
继续遍历,无邻接点,遍历结束,返回当前链表尾节点 6
递归结束,返回头节点 1,链表为: 1---2---7---8---11---12---9---10---3---4---5---6--NULL
Java:
class Solution {
public Node flatten(Node head) {
dfs(head);
return head;
}
//深度优先搜索函数
private Node dfs(Node head) {
Node cur = head;
while (cur != null) {
if (cur.child != null) {
//改变当前节点与子节点的关系
Node next = cur.next;//记录暂存下一个节点
cur.next = cur.child;//当前节点与子链表头节点连接
cur.next.prev = cur;
//传递子链表头节点作为参数到 dfs
Node childLast = dfs(cur.child);//childLast获得返回值为子链表的尾节点
childLast.next = next;//子链表尾节点与暂存节点连接
if (next != null) next.prev = childLast;//暂存节点不为空就将其prev指向子链表尾节点
cur.child = null;//子链表置空
cur = childLast;//刷新当前节点,跳过子链表的遍历
}
head = cur;//头节点刷新为当前节点
cur = cur.next;//刷新当前节点
}
return head;//返回子链表的尾节点
}
}
Python3:
class Solution:
def flatten(self, head: 'Node') -> 'Node':
self.dfs(head)
return head
def dfs(self, head):
cur = head
while cur:
if cur.child:
next = cur.next
cur.next = cur.child
cur.next.prev = cur
childLast = self.dfs(cur.child)
childLast.next = next
if next: next.prev = childLast
cur.child = None
head = cur
cur = cur.next
return head
欢迎关注微.信公.众号:爱写Bug

LeetCode 430:扁平化多级双向链表 Flatten a Multilevel Doubly Linked List的更多相关文章
- Java实现 LeetCode 430 扁平化多级双向链表
430. 扁平化多级双向链表 您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表.这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例 ...
- Leetcode 430.扁平化多级双向链表
扁平化多级双向链表 您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表.这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示. 扁 ...
- LeetCode430 扁平化多级双向链表
您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表.这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示. 扁平化列表,使所有结点 ...
- 【LeetCode】430. Flatten a Multilevel Doubly Linked List 解题报告(Python)
[LeetCode]430. Flatten a Multilevel Doubly Linked List 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: ...
- [LeetCode] Flatten a Multilevel Doubly Linked List 压平一个多层的双向链表
You are given a doubly linked list which in addition to the next and previous pointers, it could hav ...
- LeetCode 430. Flatten a Multilevel Doubly Linked List
原题链接在这里:https://leetcode.com/problems/flatten-a-multilevel-doubly-linked-list/description/ 题目: You a ...
- [LC] 430. Flatten a Multilevel Doubly Linked List
You are given a doubly linked list which in addition to the next and previous pointers, it could hav ...
- 430. Flatten a Multilevel Doubly Linked List
/* // Definition for a Node. class Node { public: int val = NULL; Node* prev = NULL; Node* next = NU ...
- LeetCode 430. Faltten a Multilevel Doubly Linked List
题目链接:LeetCode 430. Faltten a Multilevel Doubly Linked List class Node { public: int val = NULL; Node ...
随机推荐
- LeetCode 1:两数之和 Two Sum
题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中 ...
- 【Linux命令】centos防火墙使用和配置
目录 firewalld iptables Linux中的防火墙(iptables,firewalld,ip6tables,ebtables).这些软件本身并不具备防火墙功能,他们的作用都是在用户空间 ...
- 知识图谱辅助金融领域NLP任务
从人工智能学科诞生之初起,自然语言处理(NLP)就是人工智能核心的研究问题之一.NLP的重要性是毋庸置疑的,它能够实现以自然语言交流为特征的高级人机交互,使机器能“阅读”所有以文字形式记录的人类知识, ...
- WPF 修改Webbrowser的IE版本小程序(32位)
偶尔用Winform的Webbrowser,但是ie版本太低. 手改改注册表了太慢了. 弄个了程序,修改的代码时网上的,自己就是写了个界面. 支持IE11. XAML页面代码 <Window.R ...
- 前端之photoshop的简单使用
常用图片格式 图片是网页制作中很重要的素材,图片有不同的格式,每种格式都有自己的特性,了解这些特效,可以方便我们在制作网页时选取适合的图片格式. 图片格式及特性如下: 1.psd psd是photos ...
- fastjson对于yyyy-MM-dd HH:mm格式的反序列化问题
原创GrayHJX 发布于2017-03-14 22:56:33 阅读数 6851 收藏 展开 问题:最近在工作中遇到这么一个问题:有个实体类,它有个date类型的属性,当在这个属性加上fastjs ...
- WPF 启动页面 (原发布 csdn 2017-06-26 19:26:01)
如果我写的有误,请及时与我联系,我立即改之以免继续误导他/她人. 如果您有好的想法或者建议,请随时与我联系. wpf软件启动时,加载启动页面.软件初始化完成之后关闭页面. App.xaml.cs代码 ...
- MySQL学习——操作自定义函数
MySQL学习——操作自定义函数 摘要:本文主要学习了使用DDL语句操作自定义函数的方法. 了解自定义函数 是什么 自定义函数是一种与存储过程十分相似的过程式数据库对象.它与存储过程一样,都是由SQL ...
- sed文本处理
1.基本概述 sed是一个流编辑器, 非交互式的编辑器,它一次处理一行内容. 处理时,把当前处理的行存储在临时缓冲区中,称* 为"模式空间"(pattern space) 接着用 ...
- 一个java的http请求的封装工具类
java实现http请求的方法常用有两种,一种则是通过java自带的标准类HttpURLConnection去实现,另一种是通过apache的httpclient去实现.本文用httpclient去实 ...