【Leetcode——排序的循环链表】
😊😊😊
文章目录
- 一、力扣题之排序循环链表
- 二、解题思路
- 1. 使用双指针法
- 2、找出最大节点,最大节点的下一个节点是最小节点,由此展开讨论
- 总结
一、力扣题之排序循环链表
题目如下:航班直达!!
二、解题思路
刚看到直到题我还是很迷的,没有写过类似的题目。
当我看到官方题解时,嘿嘿嘿三个字形容此时的心情。
首先需要知道,这道题是升序的,但是当我们找到最大节点时,最大节点的next是最小节点,这是循环链表的缘故
1. 使用双指针法
双指针在链表这块题目还是特别特别好用的。
定义一个cur指针指向头节点,next指针指向头节点的下一个节点,这是初始状态。
这里需要分几种情况来讨论,拿题目的样例来看:
对插入数据的大小不同,分为几种情况:
1)当 insertVal大于cur的值,并且insertVal小于next的值时,
此时insertVal介于cur和next之间,插入它们之间即可。
2)当insertVal大于cur的值,并且cur的值大于next的值时,
此时cur是链表中的MAX节点,next是链表中的MIN节点。
而insertVal大于MAX节点,所以只需在cur和next之间插入即可。
3)当cur大于next的值,表明cur是MAX节点,next是MIN节点,并且insertVal的值小于next的值,此时insertVal小于MIN,只需在cur和next之间插入即可。
以上三种情况:都是在cur和next之间插入。
4)而如果链表为空,更容易了,题目也已经给出,如果链表为空,只需要返回插入的节点即可。
Node*insertnode = (Node*)malloc(sizeof(Node));insertnode->val = insertVal;insertnode->next = NULL;//链表为空if(head == NULL){insertnode->next = insertnode;return insertnode;}
5)如果链表只有一个节点,那么也不用遍历了,在head后面插入即可,一定是有序的。
//只有一个节点if(head->next == head){insertnode->next = head;head->next = insertnode;return head;}
对于链表中的节点全部相同的情况,在哪里插入都可以,这种情况已经包含在上面三种情况的一种处理了,无需再单独处理。
总代码如下:
typedef struct Node Node;struct Node* insert(struct Node* head, int insertVal) {Node*insertnode = (Node*)malloc(sizeof(Node));insertnode->val = insertVal;insertnode->next = NULL;//链表为空if(head == NULL){insertnode->next = insertnode;return insertnode;}//只有一个节点if(head->next == head){insertnode->next = head;head->next = insertnode;return head;}//两个节点及以上struct Node*cur = head,*next = head->next;while(next!=head){//以下三种情况都是在cur和next之间插入if(cur->val<=insertVal && insertVal<=next->val){break;}else if(cur->val<=insertVal && cur->val>next->val){break;}else if(cur->val>next->val && insertVal<=next->val){break;}cur = next;next = next->next;}insertnode->next = next;cur->next = insertnode;return head;
}
2、找出最大节点,最大节点的下一个节点是最小节点,由此展开讨论
第一步1)先找出最大节点,最大节点的下一个节点是最小节点,分别记录下来。
第二步2)分情况讨论:情况与第一种方法差不多,唯一不同的是:
1、当insertVal大于最小值,并且insertVal小于最大值,此时需要从最小的节点开始遍历,直到找到第一个节点的val值大于insertVal,在该节点前面插入即可。
2、当insertVal大于cur的值,并且cur的值大于next的值时,
此时cur是链表中的MAX节点,next是链表中的MIN节点。
而insertVal大于MAX节点,所以只需在cur和next之间插入即可。
3、当cur大于next的值,表明cur是MAX节点,next是MIN节点,并且insertVal的值小于next的值,此时insertVal小于MIN,只需在cur和next之间插入即可。
同样,需要在前面考虑空链表的特殊情况,而一个节点的特殊情况下面可以处理。
struct Node* insert(struct Node* head, int insertVal)
{Node*insertnode = (Node*)malloc(sizeof(Node));insertnode->val = insertVal;insertnode->next = NULL;//特殊情况if(head == NULL){insertnode->next = insertnode;return insertnode;}//1.找到最大节点Node*maxnode = head, *cur = head,*next = head->next;int max = head->val;while(next!=head){if(max<=next->val){max = next->val;maxnode = next;}cur = next;next = next->next;}//找到最大节点了//最大节点的next就是最小节点Node*minnode = maxnode->next;//2.分情况讨论//1)如果insertnode的val大于最大的或者小于最小的,则插入点在最大和最小节点之间if(insertVal>=maxnode->val || insertVal<=minnode->val){insertnode->next = minnode;maxnode->next = insertnode;return head;}//2)如果介于最大和最小节点之间,则从最小节点开始遍历//直到找到第一个比insertnode大的节点cur = minnode;next = minnode->next;while(next->val<insertVal){cur = next;next = next->next;}//找到了insertnode->next = next;cur->next = insertnode;return head;
}
总结
第一次做到循环排序链表的题,爽歪歪,写起来很舒服,链表的题需要勤快画图分析,分析二十分钟,写代码十分钟。
相关文章:

【Leetcode——排序的循环链表】
😊😊😊 文章目录一、力扣题之排序循环链表二、解题思路1. 使用双指针法2、找出最大节点,最大节点的下一个节点是最小节点,由此展开讨论总结一、力扣题之排序循环链表 题目如下:航班直达!&#…...

ChatGPT研究分享:机器第一次开始理解人类世界目录
0、为什么会对ChatGPT感兴趣一开始,我对ChatGPT是没什么关注的,无非就是有更大的数据集,完成了更大规模的计算,所以能够回答更多的问题。但后来了解到几个案例,开始觉得这个事情并不简单。我先分别列举出来,…...

【linux】Linux基本指令(上)
前言: 在之前我们已经简单了介绍了一下【Linux】,包括它的概念,由来啊等进行了讲解,接下来我们就将正式的踏入对其的学习!!! 本文目录👉操作系统的概念1.命令的语法1.1命令介绍1.2选…...

程序员必会技能—— 使用日志
目录 1、为什么要使用日志 2、自定义日志打印 2.1、在程序中得到日志对象 2.2、使用日志对象打印日志 2.3、日志格式 3、日志的级别 3.1、日志级别的分类 3.2、日志级别的设置 4、持久化日志 5、更简单的日志输出——lombok 5.1、如何在已经创建好的SpringBoot项目中添加…...

生成项目的包依赖文件requirements.txt
目录生成项目的包依赖文件requirements.txtrequirements.txt文件怎么来?使用pipreqs第三方库requirements.txt文件使用requirements.txt生成项目的包依赖文件requirements.txt 在安装部署代码时或者使用别人的项目时,会需要安装项目的依赖包,…...

安卓渐变的背景框实现
安卓渐变的背景框实现1.背景实现方法1.利用PorterDuffXfermode进行图层的混合,这是最推荐的方法,也是最有效的。2.利用canvas裁剪实现,这个方法有个缺陷,就是圆角会出现毛边,也就是锯齿。3.利用layer绘制边框1.背景 万…...

【拳打蓝桥杯】算法前置课——时间复杂度与空间复杂度
文章目录前言为什么需要复杂度分析?大O复杂度表示法时间复杂度分析几种常见时间复杂度实例分析空间复杂度分析内容小结最后说一句🐱🐉作者简介:大家好,我是黑洞晓威,一名大二学生,希望和大家一…...

vite中动态引入图片,打包之后找不到图片地址?
一般来说项目中我们集中存放图片,然后希望在页面中直接引入! 更好的就是直接在模板中调用一个函数 然后传入图片的名字就可以显示出来 事实上确实可以办到,我们用到了一个 new URL import.meta.url这俩个东西 再src目录下 static 下创建一…...

Docker 常用命令大全
目录 一、Docker (一)Docker基础命令 (二)docker镜像命令 (三)docker容器命令 (四)docker运维命令 一、Docker 容器是一种虚拟化技术,容器是镜像实例…...

React项目规范:目录结构、根目录别名、CSS重置、路由、redux、二次封装axios
React项目(一)一、创建项目二、目录结构三、craco配置别名并安装less1.craco安装2.配置别名3.安装less四、CSS样式重置五、配置路由六、配置Redux1.创建大仓库2.创建小仓库(1)方式1:RTK(2)方式2…...
SystemVerilog 教程第一章:简介
SystemVerilog 教程像 Verilog 和 VHDL 之类的硬件描述语言 (HDL) 主要用于描述硬件行为,以便将其转换为由组合门电路和时序元件组成的数字块。为了验证 HDL 中的硬件描述正确无误,就需要具有更多功能特性的面向对象的编程语言 (OOP) 来支持复杂的测试过…...

【Java|基础篇】逻辑控制-顺序结构、分支结构和循环结构
文章目录顺序结构分支结构if单分支语句if else双分支语句if else if else多分支语句switch语句循环语句for循环while循环do while循环continuebreak总结顺序结构 顺序结构是指代码按照从上往下的顺序依次执行 分支结构 选择语句是条件成立时,才会执行的语句.共有三种.分为是if…...

【数据挖掘实战】——家用电器用户行为分析及事件识别(BP神经网络)
项目地址:Datamining_project: 数据挖掘实战项目代码 目录 一、背景和挖掘目标 1、问题背景 2、原始数据 3、挖掘目标 二、分析方法与过程 1、初步分析 2、总体流程 第一步:数据抽取 第二步:探索分析 第三步:数据的预处…...
Kmeans聚类算法-python
import random import pandas as pd import numpy as np import matplotlib.pyplot as plt # 计算欧拉距离 def calcDis(dataSet, centroids, k): clalist[] for data in dataSet: diff np.tile(data, (k, 1)) - centroids #相减 (np.tile(a,(2,1))就是把…...
Linux|奇怪的知识|locate命令---文件管理小工具
前言: Linux的命令是非常多的,有一些冷门的命令,虽然很少用,但可能会有意想不到的功能,例如,本文将要介绍的locate命令。 (平常很少会想到使用此命令,find命令使用的更多,偶然想起…...
Cadence Allegro 导出Function Pin Report报告详解
⏪《上一篇》 🏡《上级目录》 ⏩《下一篇》 目录 1,概述2,Function Pin Reportt作用3,Function Pin Report示例4,Function Pin Report导出方法4.1,方法14.2,方法2B站关注“硬小二”浏览更多演示视频 1,概述...
蓝桥杯2018年第九题-缩位求和
题目:在电子计算机普及以前,人们经常用一个粗略的方法来验算四则运算是否正确。比如:248 * 15 3720把乘数和被乘数分别逐位求和,如果是多位数再逐位求和,直到是1位数,得2 4 8 14 > 1 4 5;1 5 65…...

基于Yolv5s的口罩检测
1.Yolov5算法原理和网络结构 YOLOv5按照网络深度和网络宽度的大小,可以分为YO-LOv5s、YOLOv5m、YOLOv5l、YOLOv5x。本文使用YOLOv5s,它的网络结构最为小巧,同时图像推理速度最快达0.007s。YO-LOv5的网络结构主要由四部分组成,分别…...

Linux基本命令
Linux基本命令Linux的目录结构Linux命令入门目录切换相关命令(cd/pwd)相对路径、绝对路径和特殊路径符创建目录命令(mkdir)文件操作命令part1 (touch、cat、more)文件操作命令part2 (cp、mv、rm)查找命令 (which、find…...
云原生场景下的安全左移
本博客地址:https://security.blog.csdn.net/article/details/129430859 一、安全左移概述 安全左移需要考虑开发安全、软件供应链安全、镜像仓库、配置核查这四个部分。 首先是开发安全,安全团队需要关注代码漏洞,比如使用代码检查工具进…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...