【剑指Offer】:循环有序列表的插入(涉及链表的知识)

给定循环单调非递减列表中的一个点,写一个函数向这个列表中插入一个新元素 insertVal ,使这个列表仍然是循环升序的
给定的可以是这个列表中任意一个顶点的指针,并不一定是这个列表中最小元素的指针
如果有多个满足条件的插入位置,可以选择任意一个位置插入新的值,插入后整个列表仍然保持有序
如果列表为空(给定的节点是 null),需要创建一个循环有序列表并返回这个节点。否则。请返回原先给定的节点
示例 1:

输入:head = [3,4,1], insertVal = 2
输出:[3,4,1,2]
解释:在上图中,有一个包含三个元素的循环有序列表,你获得值为 3 的节点的指针,我们需要向表中插入元素 2 。新插入的节点应该在 1 和 3 之间,插入之后,整个列表如上图所示,最后返回节点 3

示例 2:
输入:head = [], insertVal = 1
输出:[1]
解释:列表为空(给定的节点是 null),创建一个循环有序列表并返回这个节点
示例 3:
输入:head = [1], insertVal = 0
输出:[1,0]
方法:一次遍历
如果循环链表为空,则插入一个新节点并将新节点的 next 指针指向自身,插入新节点之后得到只有一个节点的循环链表,该循环链表一定是有序的,将插入的新节点作为新的头节点返回
如果循环链表的头节点的next 指针指向自身,则循环链表中只有一个节点,在头节点之后插入新节点,将头节点的 next 指针指向新节点,将新节点的 next 指针指向头节点,此时循环链表中有两个节点且一定是有序的,返回头节点
如果循环链表中的节点数大于 1,则需要从头节点开始遍历循环链表,寻找插入新节点的位置,使得插入新节点之后的循环链表仍然保持有序
用 curr 和 next 分别表示当前节点和下一个节点,初始时 curr 位于 head,next 位于head 的下一个节点,由于链表中的节点数大于 1,因此 curr≠next 遍历过程中,判断值为 insertVal 的新节点是否可以在 curr 和 next 之间插入,如果符合插入要求则在 curr 和 next 之间插入新节点,否则将 curr 和 next 同时向后移动,直到找到插入新节点的位置或者遍历完循环链表中的所有节点
遍历过程中,如果找到插入新节点的位置,则有以下三种情况:
curr.val≤insertVal≤next.val,此时新节点的值介于循环链表中的两个节点值之间,在 curr 和 next 之间插入新节点 curr.val>next.val 且 insertVal>curr.val,此时 curr 和 next 分别是循环链表中的值最大的节点和值最小的节点,insertVal 大于 curr 的节点值,因此新节点应该在 curr 的后面插入,即在 curr 和 next 之间插入新节点
curr.val>next.val 且 insertVal<next.val,此时 curr\textit{curr}curr 和 next 分别是循环链表中的值最大的节点和值最小的节点,insertVal 小于 next 的节点值,因此新节点应该在 next 的前面插入,即在 curr 和 next 之间插入新节点
如果遍历完循环链表中的所有节点之后仍然没有遇到上述三种情况,则循环链表中的所有节点值都相同,因此新节点插入循环链表中的任何位置仍可以使循环链表保持有序,此时仍可在 curr 和 next 之间插入新节点
在 curr 和 next 之间插入新节点的方法是:用 node 表示值为 insertVal 的新节点,令 curr.next\指向 node,令 node.next 指向 next,即完成插入新节点的操作
// struct Node {
// int val;
// struct Node* next;
// };//#include<stdlib.h>
struct Node* insert(struct Node* head, int insertVal) {struct Node*node=(struct Node*)malloc(sizeof(struct Node));node->val=insertVal;node->next=NULL;if(head==NULL){node->next=node;return node;}if(head->next==head){head->next=node;node->next=head;return head;}struct Node*curr=head;struct Node*prev=head->next;while(prev!=head){if(insertVal>=curr->val&&insertVal<=prev->val){break;}if(curr->val>prev->val){if(insertVal>curr->val||insertVal<prev->val){break;}}curr=curr->next;prev=prev->next;}curr->next=node;node->next=prev;return head;
}
相关文章:
【剑指Offer】:循环有序列表的插入(涉及链表的知识)
给定循环单调非递减列表中的一个点,写一个函数向这个列表中插入一个新元素 insertVal ,使这个列表仍然是循环升序的 给定的可以是这个列表中任意一个顶点的指针,并不一定是这个列表中最小元素的指针 如果有多个满足条件的插入位置,…...
【Django 04】Django-DRF(ModelViewSet)
DRF是什么? ModelViewSet 是 Django REST framework 提供的一个视图集类,它封装了常见的模型操作方法。 模型类提供了默认的增删改查功能。 它继承自 GenericViewSet、ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、Dest…...
ubuntu命令
一、 防火墙命令 1、安装防火墙 sudo sudo apt-get install ufw2、查看防火墙状态 sudo ufw status# 返回结果 # Status: inactive # 表示没有开启防火墙3、开启防火墙 sudo ufw enable# 返回结果 # Command may disrupt existing ssh connections. Proceed with operation…...
C++学习之强制类型转换
强制类型转换运算符 带着三个疑问阅读: 出现的背景是什么?何时使用?如何使用? MSDN . 强制转换运算符 C中的四种强制类型转换符详解 static_cast (1) 使用场景 在基本数据类型之间转换,如把 int 转换为 char&#…...
在Linux中,可以使用以下命令来查看进程
在Linux中,可以使用以下命令来查看进程: ps 命令:显示当前用户的进程状态。 ps:显示当前终端会话中正在运行的进程。ps aux:显示系统中所有正在运行的进程,包括其他用户的进程。ps -ef:显示系统…...
【算法训练-动态规划 一】【应用DP问题】零钱兑换、爬楼梯、买卖股票的最佳时机I、打家劫舍
废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【动态规划】,使用【数组】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…...
2023年中职组“网络安全”赛项云南省竞赛任务书
2023年中职组“网络安全”赛项 云南省竞赛任务书 一、竞赛时间 总计:360分钟 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略配置 A-3 流量完整性保护 A-4 事件监控 A-5 服务加固…...
Modeling Deep Learning Accelerator Enabled GPUs
Modeling Deep Learning Accelerator Enabled GPUs 发表在 ISPASS 2019 上。文章研究了 NVIDIA 的 Volta 和 Turing 架构中张量核的设计,并提出了 Volta 中张量核的架构模型。 基于 GPGPU-Sim 实现该模型,并且支持 CUTLASS 运行。发现其性能与硬件非常吻…...
《动手学深度学习 Pytorch版》 9.5 机器翻译与数据集
机器翻译(machine translation)指的是将序列从一种语言自动翻译成另一种语言,基于神经网络的方法通常被称为神经机器翻译(neural machine translation)。 import os import torch from d2l import torch as d2l9.5.1 …...
网络入门基础
网络入门基础 文章目录 网络入门基础网络的发展协议的概念网络协议初识协议分层层状结构OSI七层模型TCP/IP五层(或四层)模型TCP/IP模型和计算机软硬体系结构的关系 网络传输基本流程同局域网的两台主机通信不同局域网的两台主机通信 网络中的地址管理认识IP地址认识MAC地址 网络…...
Towards a Rigorous Evaluation of Time-series Anomaly Detection(论文翻译)
1 Introduction 随着工业4.0加速系统自动化,系统故障的后果可能会产生重大的社会影响(Baheti和Gill 2011; Lee 2008; Lee,Bagheri和Kao 2015)。为了防止这种故障,检测系统的异常状态比以往任何时候都更加重要ÿ…...
理解Python装饰器
本文将从多个方面对Python装饰器进行详细的阐述,并给出完整的代码示例。 一、装饰器的概念 装饰器是Python中非常重要的概念,它可以在不修改函数本身的情况下对函数的功能进行扩展或修改。装饰器本质上是一个函数,它接收一个函数作为参数&a…...
VR智慧景区,为游客开启智慧旅游新时代
近年来,文旅部加强了5G、VR虚拟技术等在文旅产业行业的运用,随着科技的不断发展,VR技术的运用越来越广泛,VR智慧景区作为一种全新的旅游方式,也渐渐的受到了人们广泛的关注,它可以让人们足不出户就欣赏到各…...
蓝桥杯 Java 青蛙过河
import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改/**二分法从大(n)到小找足够小的步长前缀和记录每个位置的前面有的总石头数(一个石头表示可以容纳一个青蛙,一位置有多少个石头hi就是多少)&…...
雷达图应该如何去绘制?
雷达图(又称为蜘蛛网图、星形图)是一种用来显示多变量数据的图表,它可以直观地展示出数据在多个维度上的表现。雷达图中,每个轴代表一个维度,所有的轴都从中心点射出并均匀分布在圆周上,形成一个星形。每个…...
1024 蓝屏漏洞攻防战(第十九课)
1024 蓝屏漏洞攻防战(第十九课) 思维导图 一 永恒之蓝的介绍 漏洞为外界所知源于勒索病毒的爆发,该病毒利用NSA(美国国家安全局)泄露的网络攻击工具 永恒之蓝( EternalBlue )改造而成,漏洞通过TCP的445和139端口,利用SMB远程代码执行漏洞,攻击者可以在目标系统上执行…...
短视频矩阵系统软件源码
短视频矩阵系统软件源码 视频成为获得免费流量最便宜的渠道,平台给所有视频最基础的保底流量。如果按照一个视频最低500流量计算,5个账户就是2500的流量,200个视频就是50W流量,如果从其他渠道获得50W流量是个很困难的事情。短视频…...
内网穿透的应用-如何通过TortoiseSVN+内网穿透,实现公网提交文件到内网SVN服务器?
文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统,它与Apache Subversion(SVN)集成在一起,提供了一个用户友好的界面,方便用…...
有没有PC端的配音软件推荐?(免下载)
配音软件还是电脑上使用最方便,而且电脑上可以使用的配音软件也非常多。只是你平时使用的不多,所有想用的时候才会找不到,对于经常使用配音软件的人来说,那真的太多了。今天给大家推荐一个免下载的配音网站,微信扫码即…...
clickhouse
官方链接 <insert id"insertTable" parameterType"com.ioc.orm.ck.model.TableModel">insert into table_name<trim prefix"(" suffix")" suffixOverrides","><if test"ts ! null">ts,</if…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
