【链表OJ题 5】牛客 CM11 链表分割

news2024/10/6 1:40:20

目录

题目来源:

代码实现:

1.带哨兵位的头结点

2.不带哨兵位的头结点

思路分析:

1.带哨兵位的头结点

实现过程:

易错点:

2.不带哨兵位的头结点

实现过程:

易错点:


题目来源:

链表分割_牛客题霸_牛客网 (nowcoder.com)

题目描述:

代码实现:

1.带哨兵位的头结点

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        struct ListNode* lesshead = NULL, * lesstail = NULL, * greaterhead = NULL,
            * greatertail = NULL, * cur = pHead;
        lesshead = lesstail = (struct ListNode*)malloc(sizeof(struct ListNode));
        greaterhead = greatertail = (struct ListNode*)malloc(sizeof(struct ListNode));

        while (cur)
        {
            //尾插
            if (cur->val < x)
            {
                lesstail->next = cur;
                lesstail = lesstail->next;
            }
            else
            {
                greatertail->next = cur;
                greatertail = greatertail->next;
            }
            //迭代
            cur = cur->next;
        }

        //连接
        lesstail->next = greaterhead->next;
        //置空大头尾结点的next
        greatertail->next = NULL;
        //将新的头结点指针赋给原头结点指针
        pHead = lesshead->next;
        //释放大小头结点并置空
        free(lesshead);
        lesshead = NULL;
        free(greaterhead);
        greaterhead = NULL;

        return pHead;
    }
};

2.不带哨兵位的头结点

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        struct ListNode* lesshead = NULL, * lesstail = NULL, * greaterhead = NULL,
            * greatertail = NULL;

        while (pHead)
        {
            //尾插
            if (pHead->val < x)
            {
                if(NULL == lesstail)
                {
                    lesshead = lesstail = pHead;
                }                    
                else
                {
                    lesstail->next = pHead;
                    lesstail = lesstail->next; 
                }
            }
            else
            {
                if(NULL == greatertail)
                {
                    greaterhead = greatertail = pHead;
                }                    
                else
                {
                    greatertail->next = pHead;
                    greatertail = greatertail->next; 
                }
            }
            //迭代
            pHead = pHead->next;
        }

        //小头为空
        if(lesshead != NULL && greaterhead == NULL)
        {
            lesstail = NULL;
            return lesshead;
        }
        //大头为空
        if(lesshead == NULL && greaterhead != NULL)
        {
            greatertail = NULL;
            return greaterhead;
        }
        //连接
        lesstail->next = greaterhead;
        //置空大头尾结点的next
        greatertail->next = NULL;

        return lesshead;
    }
};

思路分析:

1.带哨兵位的头结点

为实现本题,我们先将原链表头结点赋给cur,再开辟两个结构体,并将其分别赋给结构体指针变量,lesshead = lesstail,greaterhead = greatertail。小于 x 尾插在 lesstail->next 上,大于 x 尾插在 greatertail->next 上。

实现过程:

1.创建两个带哨兵位的新链表,分别存放小于 x 的所有结点和大于 x 的所有结点。我们定义小于 x 的头尾结点为lesshead,lesstail;定义大于 x 的头尾结点为 greaterhead,greatertail。

2.遍历链表,val < x 那么就尾插在 lesstail->next,val > x 那么就尾插在 greatertail->next。然后更新原链表的头结点和插入后的尾指针,分别都往后走一步。

3.循环步骤2,遍历完整个原链表,这时也就将大小分开了,再将 lesstail->next = greaterhead->next 并将greatertail->next = NULL,再将新的头结点赋值给原链表头,pHead = lesshead->next(因为最后要释放掉lesshead与greaterhead,并置空,所以要将小头结点赋值给pHead)。

4.释放 lesshead,greaterhead,并返回 pHead。

易错点:

可能会出现环形链表:

为了避免这种情况的发生,我们最后将 greatertail->next = NULL 处理,这样就避免了这种情况。

2.不带哨兵位的头结点

主要的思路是一致的,只是这次我们不开辟结构体,直接定义结构体指针lesshead、lesstail,greaterhead、greatertail,并将其置空。

实现过程:

与带哨兵位的头结点实现过程类似,不同点:

1.连接那块,lesstail->next = greaterhead,因为这次没有哨兵位,不用连接next。

2.返回值lesshead不是动态开辟的,不用释放,因此就不用再赋回去,直接返回 lesshead。

易错点:

1> 可能会出现环形链表:

为了避免这种情况的发生,我们最后将 greatertail->next = NULL 处理,这样就避免了这种情况。

2> 将大小分开后 lesshead或者greaterhead 可能为空,需要判断:

//小头为空
if(lesshead != NULL && greaterhead == NULL)
{
    lesstail = NULL;
    return lesshead;
}
//大头为空
if(lesshead == NULL && greaterhead != NULL)
{
    greatertail = NULL;
    return greaterhead;
}

如果大牛的您看到有什么问题留言给我,我一定会认真看的,谢谢您。如果您看了觉得有收获,关注 + 点赞支持一下呗。

*** 本篇结束 ***

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

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

相关文章

【图神经网络】GNNExplainer代码解读及其PyG实现

GNNExplainer代码解读及其PyG实现 使用GNNExplainerGNNExplainer源码速读前向传播损失函数 基于GNNExplainer图分类解释的PyG代码示例参考资料 接上一篇博客图神经网络的可解释性方法及GNNexplainer代码示例&#xff0c;我们这里简单分析GNNExplainer源码&#xff0c;并用PyTor…

2023年中职组“网络空间安全”赛项XX市竞赛任务书

2023年中职组“网络空间安全”赛项 XX市竞赛任务书 一、竞赛时间 共计&#xff1a;180分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段单兵模式系统渗透测试 任务一 SSH弱口令渗透测试 100分钟 100 任务二 Linux操作系统渗透测试 100 任…

deep learning system 笔记 自动微分 reverse mode AD

计算图 Computational Graph 图上的每个节点代表一个中间值边事输入输出的关系 forward 求导 forward mode AD 上图中从前向后&#xff0c;一步一步计算每个中间值对 x1的偏导&#xff0c;那么计算到 v7&#xff0c;就得到了整个函数对于 x1的偏导。 有limitation 对一个参数…

单机版部署Redis详细教程

概述 大多数企业都是基于Linux服务器来部署项目&#xff0c;而且Redis官方也没有提供Windows版本的安装包。因此课程中我们会基于Linux系统来安装Redis. 此处选择的Linux版本为CentOS 7. Redis的官方网站地址&#xff1a;https://redis.io/ 单机安装Redis 1.1.安装Redis依…

【IP地址与子网掩码】如何计算网络地址、广播地址、地址范围、主机个数、子网数(附详解与习题)

【写在前面】其实很多时候通过IP地址和子网掩码计算其网络地址、广播地址、可用IP&#xff0c;地址范围&#xff0c;主机数啥的&#xff0c;有些人不太清楚规则就只能瞎猜了&#xff0c;但是作为一个网络管理员还是一个基础常识的&#xff0c;这不因为最近备考网络管理员&#…

【数据结构】八大排序(二)

&#x1f61b;作者&#xff1a;日出等日落 &#x1f4d8; 专栏&#xff1a;数据结构 在最黑暗的那段人生&#xff0c;是我自己把自己拉出深渊。没有那个人&#xff0c;我就做那个人。 …

API接口的对接流程和注意事项

一、对接API数据接口的步骤通常包括以下几个部分&#xff1a; 了解API&#xff1a;首先需要详细了解API的基本信息、请求格式、返回数据格式、错误码等相关信息。可以查看API的官方文档或者使用API探索工具。同时&#xff0c;还需要明确数据请求的频率和使用权限等限制。 ​​测…

恐怖,又要有多少人下岗!AI零成本设计主图,渗入10万亿电商市场

在电商平台上&#xff0c;主图是吸引消费者点击进入商品详情页的重要因素之一。 一张高点击的电商主图&#xff0c;不仅要能够吸引消费者的眼球&#xff0c;还要能够清晰地展示产品的特点和卖点。下面是一些制作高点击电商主图的建议。 1. 突出产品特点&#xff1a;在制作主图…

【Spring】Spring的事务管理

目录 1.Spring事务管理概述1.1 事务管理的核心接口1. PlatformTransactionManager2. TransactionDefinition3. TransactionStatus 1.2 事务管理的方式 2.声明式事务管理2.1 基于XML方式的声明式事务2.2 基于Annotation方式的声明式事务 1.Spring事务管理概述 Spring的事务…

惠普暗影精灵5 super 873-068rcn如何重装系统

惠普暗影精灵5 super 873-068rcn是一款家用游戏台式电脑&#xff0c;有时候你可能用久会遇到系统出现故障、中毒、卡顿等问题&#xff0c;或者你想要更换一个新的操作系统&#xff0c;这时候你就需要重装系统。重装系统可以让你的电脑恢复到出厂状态&#xff0c;清除所有的个人…

【vite+vue3.2 项目性能优化实战】打包体积分析插件rollup-plugin-visualizer视图分析

rollup-plugin-visualizer是一个用于Rollup构建工具的插件&#xff0c;它可以生成可视化的构建报告&#xff0c;帮助开发者更好地了解构建过程中的文件大小、依赖关系等信息。 使用rollup-plugin-visualizer插件&#xff0c;可以在构建完成后生成一个交互式的HTML报告&#xf…

【提示学习】Label prompt for multi-label text classification

论文信息 名称内容论文标题Label prompt for multi-label text classification论文地址https://link.springer.com/article/10.1007/s10489-022-03896-4研究领域NLP, 文本分类, 提示学习, 多标签提出模型LP-MTC(Label Prompt Multi-label Text Classification model)来源Appli…

Docker跨主机网络通信

常见的跨主机通信方案主要有以下几种&#xff1a; 形式描述Host模式容器直接使用宿主机的网络&#xff0c;这样天生就可以支持跨主机通信。这样方式虽然可以解决跨主机通信的问题&#xff0c;但应用场景很有限&#xff0c;容易出现端口冲突&#xff0c;也无法做到隔离网络环境…

buildroot系统调试苹果手机网络共享功能

苹果手机usb共享网络调试 首先了解usb基础知识&#xff0c;比如usb分为主设备和从设备进行通信&#xff0c; 1.HOST模式下是只能做主设备&#xff0c; 2.OTG模式下是可以即做主又可以做从&#xff0c;主设备即HCD&#xff0c;从设备即UDC&#xff08;USB_GADGET &#xff09…

年后准备进腾讯的可以看看....

大家好~ 最近内卷严重&#xff0c;各种跳槽裁员&#xff0c;今天特意分享一套学习笔记 / 面试手册&#xff0c;年后跳槽的朋友想去腾讯的可以好好刷一刷&#xff0c;还是挺有必要的&#xff0c;它几乎涵盖了所有的软件测试技术栈&#xff0c;非常珍贵&#xff0c;肝完进大厂&a…

多态的原理

有了虚函数&#xff0c;会在类的对象增加一个指针&#xff0c;该指针就是虚函数表指针_vfptr;虚表本质就是函数指针数组,虚表里面存放着该对象的虚函数的地址&#xff1b; 派生类继承有虚函数基类的对象模型 子类继承父类的虚表指针时&#xff0c;是对父类的虚表指针进行了拷…

密码学:古典密码.

密码学&#xff1a;古典密码. 古典密码是密码学的一个类型&#xff0c;大部分加密方式是利用替换式密码或移项式密码&#xff0c;有时是两者的混合。古典密码在历史上普遍被使用&#xff0c;但到现代已经渐渐不常用了。一般来说&#xff0c;一种古典密码体制包含一个字母表(如…

MATLAB 点云均匀体素下采样(6)

MATLAB 点云均匀体素下采样的不同参数效果测试 (6) 一、实现效果二、算法介绍三、函数说明3.1 函数3.2 参数四、实现代码(详细注释!)一、实现效果 不同参数调整下的均匀体素下采样结果如下图所示,后续代码复制黏贴即可: 分别为0.3m,0.2m,0.1m尺度下的格网下采样结果…

【C++复习2】C++编译器的工作原理

如果你是一名newbird的话&#xff0c;建议观看如下视频加深你的理解&#xff0c;再看如下内容&#xff1a; https://www.bilibili.com/video/BV1N24y1B7nQ?p7 The cherno会额外告诉你如何将目标文件转换成汇编代码&#xff0c;CPU执行指令的过程以及编译器如何通过删除冗余变…

【MySQL】SQL优化

上一篇索引是针对查询语句进行优化,但在MySQL中可不仅有查询语句,针对其他的SQL语句同样也能进行优化 文章目录 1.插入数据2.主键优化3.order by 优化4.group by优化5.limit优化6.update优化 1.插入数据 插入数据所使用的关键字为insert,SQL语句为 insert into 表名(字段1,字…