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

news2024/9/23 11:16:05

插入排序

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

关键是放在链表中,

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.coloradmin.cn/o/1929915.html

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

相关文章

玩转HarmonyOS NEXT之IM应用首页布局

本文从目前流行的垂类市场中&#xff0c;选择即时通讯应用作为典型案例详细介绍HarmonyOS NEXT的各类布局在实际开发中的综合应用。即时通讯应用的核心功能为用户交互&#xff0c;主要包含对话聊天、通讯录&#xff0c;社交圈等交互功能。 应用首页 创建一个包含一列的栅格布…

Eureka——Spring Cloud中的服务注册与发现组件

目录 1. 前言2. Eureka的概述2.1 Eureka的核心功能2.2 Eureka的角色与特点2.3 Eureka的使用优势 3. 创建 Spring Cloud 的注册中心3.1 创建一个父项目3.2 创建Spring Cloud的注册中心Eureka 4. 创建服务提供者5. 创建一个消费者Consumer&#xff0c;调用服务提供者Provider 1. …

利用OSMnx进行城市路网数据的速度与通行时间推算及分析

本文还是以广州市路网为例&#xff0c;通过osmmx调用ox.add_edge_speeds(G)时&#xff0c;该函数会遍历图G 中的每条边&#xff08;即每条街道&#xff09;&#xff0c;并基于一些预设的规则或街道属性&#xff08;如街道类型、是否为主要道路、是否有速度限制等&#xff09;来…

netdata 监控软件安装与学习

netdata官网 netdata操作文档 前言&#xff1a; netdata是一款监控软件&#xff0c;可以监控多台主机也可以监控单台主机&#xff0c;监控单台主机时&#xff0c;开箱即用&#xff0c;web ui很棒。 环境&#xff1a; [root192 ~]# cat /etc/system-release CentOS Linux rel…

【qt】正则表达式来判断是否为邮箱登录

正则表达式是用来匹配字符串的神器. 在Qt中我们需要使用到QRegExp这个类 用exactMatch来进行匹配. [] 使用方括号 [] 来定义字符类&#xff0c;表示匹配方括号内的任意一个字符 A-Za-z0-9是字符的匹配范围. 是用于指定字符或字符类出现的次数,常见的如下 *&#xff08;匹配 0…

树结构添加分组,向上向下添加同级,添加子级

树结构添加分组&#xff0c;向上向下添加同级&#xff0c;添加子级 效果代码实现页面js 效果 代码实现 页面 <el-tree :data"treeData" :props"defaultProps" :expand-on-click-node"false":filter-node-method"filterNode" :ref&…

pico+unity3d手部动画

在 Unity 开发中&#xff0c;输入系统的选择和运用对于实现丰富的交互体验至关重要。本文将深入探讨 Unity 中的 Input System 和 XR Input Subsystem 这两种不同的输入系统&#xff0c;并详细介绍它们在控制手部动画方面的应用。 一、Input System 和 XR Input Subsystem 的区…

有关电力电子技术的一些相关仿真和分析:⑤交-直-交全桥逆变+全波整流结构电路(MATLAB/Siumlink仿真)

全桥逆变+全波整流结构 参数:Vin=500V, Vo=200V, T=2:1:1, RL=10Ω, fs=100kHz, L=1mH, C=100uF (1)给定输入电压,输出电压和主电路参数,仿真研究电路工作原理,分析工作时序; (2)调节负载电阻,实现电流连续和断续,并仿真验证; (3)调节占空比,分析占空比与电…

【2024开发插件大赛】如何为 ONLYOFFICE 开发插件

我们发布了 2024 插件开发大赛&#xff1a;为 ONLYOFFICE 开发适合中国用户的插件&#xff0c;获得福利与证书。如果您想要参加&#xff0c;阅读本文了解如何为 ONLYOFFICE 开发插件。 关于 ONLYOFFICE ONLYOFFICE 是一个国际开源项目&#xff0c;由领先的 IT 公司 Ascensio Sy…

Microsoft Edge(简称Edge)

Microsoft Edge&#xff08;简称Edge&#xff09;是一款由微软开发的网页浏览器&#xff0c;它为用户提供了许多便捷的功能和选项。以下是Edge浏览器的使用方法&#xff1a; 一、基本使用方法 打开Edge浏览器&#xff1a; 可以在Windows的开始菜单中找到“Microsoft Edge”并点…

Flink Window 窗口【更新中】

Flink Window 窗口 在Flink流式计算中&#xff0c;最重要的转换就是窗口转换Window&#xff0c;在DataStream转换图中&#xff0c;可以发现处处都可以对DataStream进行窗口Window计算。 窗口&#xff08;window&#xff09;就是从 Streaming 到 Batch 的一个桥梁。窗口将无界流…

【数据结构取经之路】二叉搜索树的实现

目录 前言 二叉搜索树 概念 性质 二叉搜索树的实现 结点的定义 插入 查找 删除 二叉搜索树完整代码 前言 首先&#xff0c;二叉搜索树是一种数据结构&#xff0c;了解二叉搜素树有助于理解map和set的特性。 二叉搜索树 概念 二叉搜索树又称二叉排序树&#xff0c…

推荐系统之MIND用户多兴趣网络

目录 引言MIND算法原理1. 算法概述2. 模型结构3. 多兴趣提取层4. 标签感知注意力层 实践应用应用场景1. 电商平台2. 社交媒体3. 视频流媒体4. 内容分发平台 结论 引言 随着大数据和人工智能技术的快速发展&#xff0c;推荐系统已成为电商平台、社交媒体和内容分发平台的重要组成…

如何用python写接口

如何用python写接口&#xff1f;具体步骤如下&#xff1a;  1、实例化server 2、装饰器下面的函数变为一个接口 3、启动服务 开发工具和流程&#xff1a; python库&#xff1a;flask 》实例化server&#xff1a;server flask.Flask(__name__) 》server.route(/index,met…

吃空上千袋,养猫10年经验,生生不息、希喂、弗列加特谁是卷王?

身为宠物医生&#xff0c;我每天都在与猫咪和狗狗的相处中度过&#xff0c;对它们的身体变化十分敏感。当前&#xff0c;许多家养猫面临肥胖和肝脏损伤的双重困扰&#xff0c;虽然医疗手段可以介入&#xff0c;但问题的核心在于宠物主人的喂养方法是否得当。 在我职业生涯的这…

磁盘空间不足java.sql.sQLException:磁盘空间不足

java.sql.sQLException:磁盘空间不足 环境介绍1 查询表空间使用情况2 对表空间文件扩展限制进行修改(或新增表空间数据文件)3 达梦数据库学习使用列表 环境介绍 遇到此错误时,首先查看数据库服务器 , 数据库相关磁盘磁盘空间使用率;在磁盘空间充足的情况下, 业务系统操作达梦数…

React Native 自定义 Hook 获取组件位置和大小

在 React Native 中自定义 Hook useLayout 获取 View、Pressable 等组件的位置和大小的信息 import {useState, useCallback} from react import {LayoutChangeEvent, LayoutRectangle} from react-nativeexport function useLayout() {const [layout, setLayout] useState&l…

搜维尔科技:【产品推荐】Euleria Health Riablo 运动功能训练与评估系统

Euleria Health Riablo 运动功能训练与评估系统 Riablo提供一种创新的康复解决方案&#xff0c;将康复和训练变得可激励、可衡量和可控制。Riablo通过激活本体感觉&#xff0c;并通过视听反馈促进神经肌肉的训练。 得益于其技术先进和易用性&#xff0c;Riablo是骨科、运动医…

CentOS7 虚谷数据库 单机版部署

单机版最低配置&#xff1a; 安装环境配置 1.CPU设置 关闭 CPU 超线程 查看当前CPU超线程状态&#xff1a; cat /sys/devices/system/cpu/smt/active 如果是0&#xff0c;表示超线程已关闭&#xff1b;返回值是1&#xff0c;表示超线程已开启。 切换超线程状态&#xff1a; &a…

pygame-键盘事件

pygame-官网文档:https://www.pygame.org/docs/ pygame-键盘事件文档:https://www.pygame.org/docs/ref/key.html pygame的维基文档https://www.pygame.org/wiki/ 这个网址记录了pygame的历史和pygame的解释 详细阅读pygame官网文档学会如何使用pygame后&#xff0c;阅读键盘…