您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。

扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。

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的更多相关文章

  1. Java实现 LeetCode 430 扁平化多级双向链表

    430. 扁平化多级双向链表 您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表.这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例 ...

  2. Leetcode 430.扁平化多级双向链表

    扁平化多级双向链表 您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表.这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示. 扁 ...

  3. LeetCode430 扁平化多级双向链表

    您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表.这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示. 扁平化列表,使所有结点 ...

  4. 【LeetCode】430. Flatten a Multilevel Doubly Linked List 解题报告(Python)

    [LeetCode]430. Flatten a Multilevel Doubly Linked List 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: ...

  5. [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 ...

  6. LeetCode 430. Flatten a Multilevel Doubly Linked List

    原题链接在这里:https://leetcode.com/problems/flatten-a-multilevel-doubly-linked-list/description/ 题目: You a ...

  7. [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 ...

  8. 430. Flatten a Multilevel Doubly Linked List

    /* // Definition for a Node. class Node { public: int val = NULL; Node* prev = NULL; Node* next = NU ...

  9. LeetCode 430. Faltten a Multilevel Doubly Linked List

    题目链接:LeetCode 430. Faltten a Multilevel Doubly Linked List class Node { public: int val = NULL; Node ...

随机推荐

  1. postman测试文件上传接口教程

    postman是一个很好的接口测试软件,有时候接口是Get请求方式的,肯定在浏览器都可以测了,不过对于比较规范的RestFul接口,限定了只能post请求的,那你只能通过工具来测了,浏览器只能支持ge ...

  2. 15-scrapy-redis两种形式分布式爬虫

    什么叫做分布式爬虫? 分布式爬虫,就是多台机器共用一个scrapy—redis程序高效爬取数据, 为啥要用分布式爬虫? 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器 ...

  3. gcc原子操作测试

    #include <stdio.h> #include <pthread.h> #include <stdlib.h> ; void *test_func(void ...

  4. 【转】ASP.NET Core 如何设置发布环境

    在ASP.NET Core中自带了一些内置对象,可以读取到当前程序处于什么样的环境当中,比如在ASP.NET Core的Startup类的Configure方法中,我们就会看到这么一段代码: publ ...

  5. CDN(Content Delivery Network)原理

    CDN即内容分发网络,一般包括分发服务系统,负载均衡系统和管理系统. 分发服务系统,其基本的工作单元就是各个cache服务器.负责直接响应用户请求,将内容快速分发到用户:同时还负责内容更新,保证和源站 ...

  6. crm-全总结

    1.什么是crm 客户关系管理系统 ,以客户数据为中心建立一个信息收集.管理.分析和利用的信息系统 2.业务逻辑相关使用crm-app完成 1)路由项目分发到crm-app (别名 传参 命名空间) ...

  7. webservice调用天气服务

    常见服务:http://www.webxml.com.cn/zh_cn/support.aspx 可能用到缺少的ArrayOfString.java文件 package com.test.wes.we ...

  8. Visual Studio Code 配置 EasyLESS,如果想用less,但又不想在组件中直接添加 style 时可以参考

    在用 vue 画页面时,如果想用less,但又不想在组件中直接添加 style ,可以使用 vs code 的插件:EasyLess EasyLess 安装好后必须在 setting.json 中对它 ...

  9. JSAPI签权

    JSAPI鉴权----钉钉H5开发 虽钉钉开发文档上写着不需要JSAPI签权,但这仅仅是针对Android手机 所以为了保险起见,在使用JSAPI前,都需要签权. 否则:dd.ready({}) 将不 ...

  10. Mysql—常见查询命令

    查询mysql的日志 -- 查找错误日志文件路径 mysql> show variables like "log_error"; -- 查找通用日志文件路径 mysql> ...