双向链表、双向循环链表

目录

多级双向链表

力扣 430. 扁平化多级双向链表

双向循环链表

力扣 426. 将二叉搜索树转化为排序的双向链表


多级双向链表

力扣 430. 扁平化多级双向链表

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

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

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

 

示例 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]
解释:输入的多级列表如上图所示。
扁平化后的链表如下图:

示例 2:

输入:head = [1,2,null,3]
输出:[1,3,2]
解释:输入的多级列表如上图所示。
扁平化后的链表如下图:

示例 3:

输入:head = []
输出:[]
说明:输入中可能存在空列表。

 

提示:

  • 节点数目不超过 1000
  • 1 <= Node.val <= 105

 

如何表示测试用例中的多级链表?

以 示例 1 为例:

 1---2---3---4---5---6--NULL|7---8---9---10--NULL|11--12--NULL

序列化其中的每一级之后:

[1,2,3,4,5,6,null]
[7,8,9,10,null]
[11,12,null]

为了将每一级都序列化到一起,我们需要每一级中添加值为 null 的元素,以表示没有节点连接到上一级的上级节点。

[1,2,3,4,5,6,null]
[null,null,7,8,9,10,null]
[null,11,12,null]

合并所有序列化结果,并去除末尾的 null 。

[1,2,3,4,5,6,null,null,null,7,8,9,10,null,null,11,12]
class Solution {
public:Node* flatten(Node* head) {return flatten2(head)[0];}vector<Node*> flatten2(Node* head) {vector<Node*>ans;ans.push_back(head);auto p = head;auto p2 = p;while (p) {p2 = p;if (p->child) {vector<Node*>cs = flatten2(p->child);cs[0]->prev = p;if (p->next) {cs[1]->next = p->next;p->next->prev = cs[1];}p->next = cs[0];p->child = nullptr;}p = p->next;}ans.push_back(p2);return ans;}
};

双向循环链表

力扣 426. 将二叉搜索树转化为排序的双向链表

将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 。

对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。

特别地,我们希望可以 就地 完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中最小元素的指针。

示例 1:

输入:root = [4,2,5,1,3] 


输出:[1,2,3,4,5]

解释:下图显示了转化后的二叉搜索树,实线表示后继关系,虚线表示前驱关系。

示例 2:

输入:root = [2,1,3]
输出:[1,2,3]
示例 3:

输入:root = []
输出:[]
解释:输入是空树,所以输出也是空链表。
示例 4:

输入:root = [1]
输出:[1]
 

提示:

-1000 <= Node.val <= 1000
Node.left.val < Node.val < Node.right.val
Node.val 的所有值都是独一无二的
0 <= Number of Nodes <= 2000

//创建单节点双向循环链表
Node* getList(int val = 0)
{Node* p = new Node;p->left = p, p->right = p, p->val = val;return p;
}
//合并双向循环链表
void merge2list(Node* p1, Node* p2)
{if (!p1 || !p2)return;p1->left->right = p2, p2->left->right = p1;Node* tmp = p2->left;p2->left = p1->left;p1->left = tmp;
}class Solution {
public:Node* treeToDoublyList(Node* root) {if (!root)return NULL;Node* n1 = getList(root->val);if (root->left) {Node* n2 = treeToDoublyList(root->left);merge2list(n2, n1);n1 = n2;}if (root->right) {Node* n3 = treeToDoublyList(root->right);merge2list(n1, n3);}return n1;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/286862.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有损编码——Wyner-Ziv理论

有损编码是一种在信息传输和存储中常见的编码技术&#xff0c;其主要目标是通过牺牲一定的信息质量&#xff0c;以换取更高的压缩效率。相比于无损编码&#xff0c;有损编码可以在保证一定程度的信息还原的前提下&#xff0c;使用更少的比特数来表示信息。Wyner-Ziv理论是一种重…

Eclipse_03_如何加快index速度

1. ini配置文件 -Xms&#xff1a;是最小堆内存大小&#xff0c;也是初始堆内存大小&#xff0c;因为堆内存大小可以根据使用情况进行扩容&#xff0c;所以初始值最小&#xff0c;随着扩容慢慢变大。 -Xmx&#xff1a;是最大堆内存大小&#xff0c;随着堆内存的使用率越来越高&a…

maven仓库导入jar和mvn命令汇总

目录 导入远程仓库 命令结构 命令解释 项目pom 输入执行 本地仓库导入 命令格式 命令解释 Maven命令汇总 mvn 参数 mvn常用命令 web项目相关命令 导入远程仓库 命令结构 mvn deploy:deploy-file -Dfilejar包完整名称 -DgroupIdpom文件中引用的groupId名 -Dartifa…

设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

原型模式 原型模式(Prototype模式)是指&#xff1a;用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型&#xff0c;创建新的对象。 原型模式是一种创建型设计模式&#xff0c;允许一个对象再创建另外一个可定制的对象&#xff0c;无需知道如何创建的细节。 工作原…

visionOS空间计算实战开发教程Day 9 打造“任意门”

我们在​​Day 8​​中演示了attachment的实现&#xff0c;本节的知识点是portal。portal相当于哆啦A梦里的任意门&#xff0c;它让我们可以打开另一个世界&#xff0c;这个世界独立于当前的世界&#xff0c;具有单独的光照系统并且由portal几何图形进行遮罩。 要创建portal&a…

头部首发优志愿头部u_sign生成与TLS指纹处理! + 数据可视化技术讲解【Python爬虫】

目录 针对大学名称 大学排名, 综合指数,学校情况等数据进行爬取 找对应得数据包 请求发现数据有加密 发现加密参数 搜索加密参数&#xff0c;好进行分析 分析过程 数据可视化 针对大学名称 大学排名, 综合指数,学校情况等数据进行爬取 首先进行鼠标右键&#xff0c;进行…

在vue中通过js动态绘制table,并且合并连续相同内容的行,支持点击编辑单元格内容

首先是vue代码 <template><div id"body-container"style"position: absolute"><div class"box-container"><div class"lsb-table-box" ><div class"table-container" id"lsb-table"&…

只有可复制的生意才能做大,2024靠谱创业项目推荐!

20多的时候谈过一个男朋友&#xff0c;就是这个人给了我极大的生意认知。他说蓉蓉&#xff0c;你一定要去做那种火腿肠一样的生意&#xff0c;不要去做那种猪肉铺子的生意。 猪肉铺子比如有个人过来说我要买猪耳朵&#xff0c;是不是你要给他猪耳朵切的咔咔咔切&#xff0c;有人…

数据分析场景下,企业大模型选型的思路与建议

来源/作者&#xff1a;爱分析 随着大模型带来能力突破&#xff0c;让AI与数据分析相互结合&#xff0c;使分析结果更好支撑业务&#xff0c;促进企业内部数据价值释放&#xff0c;成为了当下企业用户尤为关注的话题。本次分享主要围绕数据分析场景下大模型底座的选型思路&#…

Kafka 安装与部署

目录 Kafka 下载 &#xff08;1&#xff09;将 kafka_2.11-2.4.1.tgz 上传至 /opt/software/ &#xff08;2&#xff09;解压安装包至 /opt/module/ [huweihadoop101 ~]$ cd /opt/software/ [huweihadoop101 software]$ tar -zxvf kafka_2.11-2.4.1.tgz -C ../module/&#…

数据结构(八):图介绍及面试常考算法

一、图介绍 1、定义 图由结点的有穷集合V和边的集合E组成。其中&#xff0c;结点也称为顶点。一对结点&#xff08;x&#xff0c; y&#xff09;称为边&#xff08;edge&#xff09;&#xff0c;表示顶点x连接到顶点y。边可以包含权重/成本&#xff0c;显示从顶点x到y所需的成…

最小二乘法在线性回归中的用法

最小二乘法在线性回归中的用法 最小二乘法是1809年高斯在《天体运动论》中公开发表的一种计算方法。最小二乘法其实是一种“最佳猜测”的方法。想象一下&#xff0c;你有一些数据点&#xff0c;比如你朋友的身高和体重。你想找到一个简单的规则来描述这两者之间的关系。最小二…