扁平化多级双向链表

news/2025/2/22 1:42:35

题目描述:
多级双向链表中,除了指向下一个节点和前一个节点指针之外,它还有一个子链表指针,可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。

给你位于列表第一级的头节点,请你扁平化列表,使所有结点出现在单级双链表中。

链接:https://leetcode-cn.com/problems/flatten-a-multilevel-doubly-linked-list

示例 1:

输入: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]
解释:
输入的多级列表如下图所示:
在这里插入图片描述
扁平化后的链表如下图:
在这里插入图片描述

dfs_18">一、dfs

借用官方的图:
在这里插入图片描述

思路分析:深度优先搜索,当遇到child节点不为空时,先搜索child节点,再继续搜索next节点。

  1. 借用一个vector空间,里面存放搜索到的节点
  2. 遍历链表
  3. child不为空,先搜索child分支上的节点
  4. 再继续搜索next节点
  5. 遍历完成返回,将vector中节点链接起来

child节点搜索完之后,一定要置为空。

代码:

class Solution {
public:
    vector<Node*> vn;
    void dfs(Node* head)
    {
        if(head == nullptr)
            return;
        vn.push_back(head);//将节点放入
        if(head->child != nullptr)//child不为空,先搜索child分支节点
        {    
            dfs(head->child);
            head->child = nullptr;//置为空
        }
        dfs(head->next);//搜索下一个节点
    }
    Node* flatten(Node* head) {
        if(head == nullptr)
            return nullptr;
        dfs(head);//dfs搜索
        int sz = vn.size();
        for(int i = 1; i < sz; ++i)//链接起来
        {
            vn[i - 1]->next = vn[i];
            vn[i]->prev = vn[i - 1];
        }
        return vn[0];//返回
    }
};

二、迭代

思路分析:借用一个栈,遍历链表,如果某节点有child,则将该节点入栈,然后遍历child节点分支,此时child分支走到末尾时,链接节点。

  1. 借用辅助栈,遍历链表
  2. 如child不为空,将该节点入栈,然后遍历child节点分支
  3. child分支为空,链接链表
  4. 具体链接细节都在代码里了

代码:

class Solution {
public:
    Node* flatten(Node* head) {
        if(head == nullptr)
            return nullptr;
        stack<Node*> st;
        Node* p = head;
        while(p != nullptr || !st.empty())
        {
            if(p->child != nullptr)
            {
                st.push(p);//push进去
                p->child->prev = p;//先改变child->prev指向
                p = p->child;//改变当前节点,遍历child节点分支
            }

            if(p->next == nullptr && !st.empty())
            {
                Node* tmp = st.top();//child分支为空,栈不为空,则链接链表
                if(tmp-> next != nullptr)//父节点next不为空,则链接child节点的尾节点
                {
                    p->next = tmp->next;
                    tmp->next->prev = p;
                }
                tmp->next = tmp->child;//改变父节点next指向
                p = tmp;//重新改变p的位置,将p指向父节点的位置
                tmp->child = nullptr;//把child节点置为空
                st.pop();
            }
            p = p->next;
        }
        return head;
    }
};

http://www.niftyadmin.cn/n/1664376.html

相关文章

【数据结构】初识数据结构

一、数据结构的基本概念 1、基本概念和术语 &#xff08;1&#xff09;数据&#xff1a;数据是信息的载体&#xff0c;是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。 &#xff08;2&#xff09;数据元素&#xff1a;数据元素是…

MySQL 第十二章 表的创建、数据的插入删除

十二、表的创建、数据的插入删除 12.1 建表的语法格式&#xff1a; 回顾一下&#xff0c;建表属于DDL语句&#xff0c;DDL包括&#xff1a;create drop alter create table 表名 &#xff08;字段名1 数据类型,字段名2 数据类型,字段名3 数据类型, );注意&#xff1a; 表名…

【云原生丶Kubernetes】Kubernetes初体验

人生若只如初见&#xff0c;何事秋风悲画扇。 前言 Kubernetes 是目前最流行的容器编排工具之一&#xff0c;由Google开发并维护。它提供了完整的容器编排解决方案&#xff0c;包括自动化部署、资源管理和调度、服务发现和负载均衡等功能。 然而&#xff0c;对于初学者来说&a…

POJ1287 Networking【最小生成树】

题意&#xff1a; 给出n个节点&#xff0c;再有m条边&#xff0c;这m条边代表从a节点到b节点电缆的长度&#xff0c;现在要你将所有节点都连起来&#xff0c;并且使长度最小 思路&#xff1a; 这是个标准的最小生成树的问题&#xff0c;用prim的时候需要注意的是他有重边&#…

初学Python的学习笔记11----使用元类、错误处理和调试

2019独角兽企业重金招聘Python工程师标准>>> 1.使用元类 (1)type() # 使用type()创建一个class对象 type(className,fatherClassObj,classFuc) # className:class的名称 # fatherClassObj:继承的父类集合&#xff0c;Python支持多重继承&#xff0c;如果只有一个父类…

有序链表转换二叉搜索树

题目描述&#xff1a; 给定一个单链表&#xff0c;其中的元素按升序排序&#xff0c;将其转换为高度平衡的二叉搜索树。 本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 示例: 给定的有序链表&#xff1a; [-10, -3,…

2.Vue.js前端框架:基础特性

2.1 Vue实例及选项 每个Vue.js的应用都需要通过构造函数创建一个Vue的实例。创建一个Vue实例的语法格式如下&#xff1a; var vm new Vue ({//选项})在创建对象实例时&#xff0c;可以在构造函数中传入一个选项对象。选项对象中包括挂载元素、数据、方法、生命周期钩子函数等…

C++ new 解析重载

C new 解析重载 new的三种形式&#xff1a; &#xff08;1&#xff09;operator new&#xff08;运算符new&#xff09; &#xff08;2&#xff09;new operator&#xff08;new 操作&#xff09; &#xff08;3&#xff09;placement new&#xff08;特殊的new操作&#xff0…