【初阶数据结构】——牛客:CM11 链表分割

news/2024/7/5 23:17:48 标签: c语言, 链表, 开发语言

文章目录

  • 1. 题目介绍
  • 2. 思路分析
  • 3. 代码实现

1. 题目介绍

链接: link
在这里插入图片描述
这道题是给我们一个链表和一个值X ,要求我们以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前。
最终返回重新排列之后的链表的头指针。

2. 思路分析

那这道题呢比较简单的一种思路是这样的:

新建两个链表less和greater,遍历原链表将原链表中值小于X的结点尾插(题目要求不能改变原来的数据顺序)到less链表,将大于等于X的结点尾插到greater链表,然后将两个链表合并:greater链接到less后面。

那么另外呢:

对于新建的链表我们可以选择不带哨兵位的头结点,也可以选择带哨兵位的头结点的链表
但是,对于这道题来说建议大家选取带头结点的链表结构
如果不带头的话,实现起来就会比较麻烦。带头的和就会方便很多。
首先带头结点的话尾插的时候空表的情况不需要单独判断,另外如果出现链表结点的值都比给定的X大,那这样第一个链表就是空,如果有头结点的话,空表状态也有一个头结点,这里把第二个链表往第一个链表后面链接的时候也会很方便。
当然如果是带头结点的话最后链接返回之后最好把头结点也释放掉。
在这里插入图片描述

那按照上面的思路,我们来尝试写一下代码

3. 代码实现

在这里插入图片描述

感觉好像没什么问题了,我们来提交一下:
在这里插入图片描述

🆗,我们看到没有通过全部的测试用例,怎么回事呢?

有一种情况我们没能处理好:
如果重新排列之后的尾结点不是原链表的尾结点,就会有一个问题。
其实我们上面给大家画的那个图就是这样
在这里插入图片描述
大家看到了嘛,这里的7这个结点,是重新排列之后的尾结点,但是不是原链表的尾结点,我们这样连接之后,7是尾结点,尾结点的next应该指向空,但是此时它仍然指向原链表中他后面的那个结点4,那么这样的话我们返回的链表就是一个带环的链表,遍历的时候就会陷入死循环。

我们可以来测试一下图中的这个测试用例,看看是不是这样:

在这里插入图片描述
我们看到后面就陷入了7,4,2,6的死循环。

所以:

不论最终的尾结点是不是原链表的尾结点,我们都把它置成NULL
在这里插入图片描述
再来提交
在这里插入图片描述
就🆗了。

class Partition {
  public:
    struct ListNode* partition(struct ListNode* pHead, int x) {
        struct ListNode* smallhead = (struct ListNode*)malloc(sizeof(struct ListNode));
        struct ListNode* bighead = (struct ListNode*)malloc(sizeof(struct ListNode));
        struct ListNode* smalltail = smallhead;
        smalltail->next = NULL;
        struct ListNode* bigtail = bighead;
        bigtail->next = NULL;

        struct ListNode* cur = pHead;
        while (cur) {
            if (cur->val < x) {
                smalltail->next = cur;
                smalltail = cur;
            } else {
                bigtail->next = cur;
                bigtail = cur;
            }
            cur = cur->next;
        }
        smalltail->next = bighead->next;
        bigtail->next=NULL;

        pHead = smallhead->next;
        free(smallhead);
        free(bighead);
        return pHead;
    }
};

http://www.niftyadmin.cn/n/5460899.html

相关文章

Unity urp渲染管线下,动态修改材质球surfaceType

在项目中遇到了需要代码动态修改材质球的surfaceType&#xff0c;使其动态切换是否透明的需求。 urp渲染管线下&#xff0c;动态修改材质球的surfaceType&#xff0c;查了大部分帖子&#xff0c;都有一些瑕疵&#xff0c;可能会造成透明后阴影投射有问题。 其次在webgl平台上…

EXCEL VBA将word里面的指定的关键词替换掉后并标记红色字体

EXCEL VBA将word里面的指定的关键词替换掉后并标记红色字体 Sub 开关() Call 新建副本 Call ReplaceAndHighlightInFolder End Sub Sub 新建副本()fpath ThisWorkbook.Path & "\"Dim MyFile As ObjectSet MyFile CreateObject("Scripting.FileSystemObjec…

在新能源充电桩、智能充电枪、储能等产品领域得到广泛应用的两款微功耗轨至轨运算放大器芯片——D8541和D8542

D8541和D8542是我们推荐的两款微功耗轨至轨运算放大器芯片&#xff0c;其中D8541为单运放&#xff0c; D8542为双运放&#xff0c;它特别适用于NTC温度采集电路、ADC基准电压电路、有源滤波器、电压跟随器、信号放大器等电路应用&#xff0c;在新能源充电桩、智能充电枪、…

springMVC中的适配器模式是怎么使用的

Spring MVC中的适配器模式体现在对Controller接口的不同实现进行统一处理的过程。在Spring MVC中&#xff0c;HandlerAdapter是适配器模式的具体体现&#xff0c;它允许DispatcherServlet与各种类型的Controller进行交互&#xff0c;而不必关心Controller的具体实现细节。下面通…

腾讯云2核2G服务器优惠价格,61元一年

腾讯云2核2G服务器多少钱一年&#xff1f;轻量服务器61元一年&#xff0c;CVM 2核2G S5服务器313.2元15个月&#xff0c;轻量2核2G3M带宽、40系统盘&#xff0c;云服务器CVM S5实例是2核2G、50G系统盘。腾讯云2核2G服务器优惠活动 txybk.com/go/txy 链接打开如下图&#xff1a;…

面试题:Spring Boot Actuator端点的使用和安全性设置

Spring Boot Actuator 是一个非常强大的模块&#xff0c;它为基于 Spring Boot 构建的应用程序提供了丰富的监控和管理功能。Actuator 提供了一系列端点&#xff08;Endpoints&#xff09;&#xff0c;允许开发者和运维人员深入了解应用运行状态&#xff0c;包括但不限于健康检…

wpsword求和操作教程

wpsword求和怎么操作&#xff1a; 1、首先&#xff0c;单纯的数据是无法求和的&#xff0c;所以我们必须要“插入”一个“表格” 2、接着将需要求和的数据填入到表格中。 3、填完后&#xff0c;进入“布局”选项卡。 4、然后打开其中的“公式” 5、在其中选择求和公式“SUM”并…

基础强化-Java-面向对象设计

名称规范 1 名词 ex:java.lang.String 2 双名词 ex:java.util.ArrayList 3 形容词 名词 ex:java.util.LinkedList 访问性设计 public(都可以访问) protected(继承 同包) default(同包) private(当前类)private和protected 不能用于修饰类&#xff08;这个类是最外层的内&a…