C++:链表插入排序/删除重复节点题解

插入排序

插入排序的思路很简单,基本都知道。

关键是放在链表中,

1.要建立一个哨兵位,这个哨兵位的下一个节点,始终指向val最小的节点。

2.prev指针作为cur的前一个节点,始终指向val最大的节点。它的下一个节点始终指向cur/cur即将跳跃的待排序的节点。

3.cur指向待排序的第一个节点。

cur从第二个开始,prev就指向头节点。

代码:

 /* Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* insertionSortList(ListNode* head) {if(head==nullptr || head->next==nullptr){return head;}ListNode* dummy = new ListNode(0);//建立一个哨兵位,始终指向最小的dummy->next=head;ListNode* cur=head->next;ListNode* prev=head;while(cur){if(prev->val <= cur->val)//prev始终指向最大的,cur的前一个{prev=cur;cur=cur->next;}else{ListNode* tmp=dummy;while(tmp->next->val <= cur->val)//不用考虑走到空,这里一定有大于cur的值{tmp=tmp->next;}prev->next=cur->next;//标记,方便cur跳跃//cur插入tmp和tmp->next中cur->next=tmp->next;tmp->next=cur;//cur跳跃cur=prev->next;}}ListNode* newhead = dummy->next;delete dummy;return newhead;}
};

2.删除链表中的重复节点

分析:

1.删除重复节点可能会遇到连续多个重复节点,因此需要在循环进行。

2.删除的重复节点是头节点和不是头节点要分别处理,是头节点,那么头节点要换到next,不是头节点,就不需要更换头节点了。(最后返回头节点)

3.删除节点的方式,这题我使用的是跳过这个节点,而不是释放节点。

4.在判断cur节点和next节点值相等的循环中,跳出循环时,next走到下一个节点,下一个节点是空和不是空要分别处理。

这里要声明3个节点,头节点是已经给了的,始终指向第一个存在的位置,如果它要被删除,那么它要更换别的不被删除的位置,如果所有的节点都可以消消乐,那么就要让它指向空。

cur节点指向即将判断的第一个节点,next节点指向即将判断的第二个节点。如果判断不相等。prev就指向cur,cur和next依次往后走一个位置。prev永远指向安全的不被删除的位置,永远指向cur的前,当连续存在相等的值时,next一直往下走和cur判断。直到走到不等的位置时跳出,此时需要prev的next指针指向这个不与cur相等的更新的next,接着再更新cur和next的位置。

这道题可能会坑的地方基本指出,其余的就是逻辑上要考虑到所有情况,不能让任何一种情况遗漏了。

代码:

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};
*/class Solution {
public:ListNode* deleteDuplication(ListNode* pHead) {if(pHead==nullptr || pHead->next==nullptr){return pHead;}ListNode* cur=pHead;ListNode* prev=nullptr;ListNode* next=pHead->next;while(next){if(cur->val==next->val){while(next&&cur->val==next->val){next=next->next;}if(cur==pHead&&next==nullptr){return nullptr;}else if(cur==pHead&&next!=nullptr){pHead=next;}else if(cur!=pHead &&next!=nullptr){prev->next=next;}else{prev->next=next;return pHead;}cur=next;if(next){next=cur->next;}}else{prev=cur;cur=next;next=next->next;}}return pHead;}
};

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

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

相关文章

JavaFX+MySQL实现图书管理系统(包含完整代码)

目录 一、功能介绍 1.ER图 2.学生管理员登陆页面 3.图书馆首页 4.学生图书馆搜索界面 5.学生注册 6.管理员后台 增加书籍 查看借阅记录 ​编辑 修改图书 二、功能分解 1.界面展示 2.点击按钮切换页面 普通按钮点击 复杂按钮点击 3.登录注册 创建登陆注册的页…

逆向学习思路链接分享

学好逆向先学C 然后我们需要学习好 编码问题CTF常见编码及加解密&#xff08;超全&#xff09; - ruoli-s - 博客园 (cnblogs.com) 并且规划好学习路线 CTF逆向Reverse入门学习路线&#xff08;面向小白&#xff09;_逆向reverse 思路-CSDN博客 并且安好反编译的环境 x64d…

【教学类-67-02】20240716毛毛虫ABB排序

背景需求&#xff1a; 【教学类-67-01】20240715毛毛虫AB排序-CSDN博客文章浏览阅读584次&#xff0c;点赞16次&#xff0c;收藏6次。【教学类-67-01】20240715毛毛虫AB排序https://blog.csdn.net/reasonsummer/article/details/140443310 在AB排序基础上&#xff0c;继续制作…

【Django+Vue3 线上教育平台项目实战】登录功能模块之短信登录与钉钉三方登录

文章目录 前言一、几个关键概念1.HTTP无状态性2.Session机制3.Token认证4.JWT 二、通过手机号验证码登录1.前端短信登录界面2.发送短信接口与短信登录接口3.Vue 设置interceptors拦截器4. 服务端验证采用自定义中间件方式实现5. 操作流程及效果图如下&#xff1a; 三、通过第三…

记录些MySQL题集(9)

MySQL之死锁问题分析、事务隔离与锁机制的底层原理剖析 一、MySQL中的死锁现象 所谓的并发事务&#xff0c;本质上就是MySQL内部多条工作线程并行执行的情况&#xff0c;也正由于MySQL是多线程应用&#xff0c;所以需要具备完善的锁机制来避免线程不安全问题的问题产生&#…

手机如何伪装ip网络地址

伪装IP地址是指通过技术手段修改网络设备的IP地址&#xff0c;使其看起来像是来自另一个网络位置。这种技术通常用于隐藏真实的网络活动&#xff0c;以保护隐私。那么&#xff0c;手机如何伪装IP网络地址&#xff1f; 要在手机上伪装IP地址&#xff0c;‌可以通过下载和安装手机…

数据资产通证化,堪比20年前的房地产?

大数据产业创新服务媒体 ——聚焦数据 改变商业 想象一下&#xff0c;一个简单的点击&#xff0c;一次不经意的搜索&#xff0c;一段简短的对话&#xff0c;它们在数字世界里留下了什么&#xff1f;是的&#xff0c;是数据。这些看似微不足道的数字碎片&#xff0c;汇聚成海&a…

【python】PyQt5的窗口界面的各种交互逻辑实现,轻松掌控图形化界面程序

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【中项】系统集成项目管理工程师-第一模块:IT技术和管理-1.1信息与信息化-1.1.2信息系统基础

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&#xff0c;目前涵盖了计算机软件、计算机网络、计算机应…

Office动态水印终于来了

在信息安全日益重要的今天&#xff0c;保护敏感信息变得尤为关键。目前&#xff0c;动态水印甚至是盲水印技术已经在各种企业软件中广泛应用&#xff0c;常见的钉钉和企业微信等都已经支持此类技术&#xff0c;用户查看消息时画面会显示对应用户的姓名和工号等&#xff0c;而作…

小程序-视图与逻辑

一、页面导航 声明式导航 编程式导航 导航传参 1.声明式导航传参 2.编程式导航传参 3.在onload中接收导航参数 二、页面事件 下拉刷新 上拉触底 三、生命周期 分类 生命周期函数分类 1.应用的生命周期函数 2.页面的生命周期函数 四、WXS脚本 基础语法 wxs的特点 五、案…

几何相关计算

目录 一、 判断两个矩形是否相交 二、判断两条线段是否相交 三、判断点是否在多边形内 四、垂足计算 五、贝塞尔曲线 六、坐标系 一、 判断两个矩形是否相交 当矩形1的最大值比矩形2的最小值都小&#xff0c;那矩形1和矩形2一定不相交&#xff0c;其他同理。 struct Po…

华为OD 机试真题 - 分割均衡字符串(Python)

题目描述 均衡串定义:字符串只包含两种字符&#xff0c;且两种字符的个数相同。 给定一个均衡字符串&#xff0c;请给出可分割成新的均衡子串的最大个数。 约定字符串中只包含大写的’X"和’Y’两种字符。 输入描述 均衡串:XXYYXY 字符串的长度[2,10000]。给定的字符…

10.1 标注、注记图层和注记整体说明

文章目录 前言标注、注记图层和注记QGis中的标注QGis中的注释(Annotation)图层QGis中的注记 总结 前言 介绍标注、注记图层和注记说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 标注、注记图层和注记 有时地图需要使用一些文字信息说明其中的地理要素或其…

如何落地实际场景,解决跨境传输共性需求?免费白皮书可下载

在全球化的背景下&#xff0c;海外市场对于数据驱动的产品和服务的需求不断增加&#xff0c;各行业数据跨境传输也日趋频繁&#xff0c;在这种前景下&#xff0c;越来越多的企业寻求更深度的跨国业务及合作&#xff0c;因此&#xff0c;企业数据跨境流动也成为了势不可挡的趋势…

51单片机嵌入式开发:11、 STC89C52RC 实现一个滑动的led点阵程序

STC89C52RC 实现一个滑动的led点阵程序 1 概述2 LED点阵介绍2.1 LED概述2.2 LED点阵注意事项 3 LED点阵原理3.1 Led点阵内部电路3.2 原理图电路 4 软件实现点阵图案的滑动4.1 软件工程代码4.2 Protues仿真 5 扩展74HC595&#xff08;后续专题开展&#xff09;6 总结 第十一节 1…

如何制定高效的媒体公关解决方案

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体公关解决方案是指企业或组织为提升品牌形象、塑造公众认知、应对危机事件等目的&#xff0c;通过媒体渠道制定并实施的一系列公关策略和行动计划。这一解决方案旨在通过有效的媒体沟…

socket功能定义和一般模型

1. socket的功能定义 socket是为了使两个应用程序间进行数据交换而存在的一种技术&#xff0c;不仅可以使同一个主机上两个应用程序间可以交换数据&#xff0c;而且可以使网络上的不同主机间上的应用程序间进行通信。 2. 图解socket的服务端/客户端模型

广告投放的智能优化:Kompas.ai如何提高广告效果

在数字广告领域&#xff0c;智能优化已成为提升广告投放效果和投资回报率(ROI)的关键。Kompas.ai&#xff0c;一款先进的广告智能优化工具&#xff0c;利用数据分析和机器学习技术&#xff0c;帮助广告主实现更精准、高效的广告投放。 智能优化在提升广告效果中的作用 智能优化…

30.【C语言】详解printf

1.printf&#xff08;print formate&#xff09;输入函数 01.简单使用 调用前要引用头文件 #include <stdio.h> printf("abc"); 默认情况下打印完光标停留在同一行 \n可以换行 printf("abc\n"); ​ printf("ab\nc"); ​ printf(…