【分割链表】

news2025/6/29 7:10:24

目录:

  • 前言
  • 一、题目描述
  • 二、算法思想
    • (一)值交换
      • 1、题目解析
      • 2、代码实现
    • (二)重构链表
      • 1、题目解析
      • 2、代码实现
  • 总结

前言

在这里插入图片描述
大家好,今天我们来了解一下leetcode中比较简单的单链表问题。

一、题目描述

题目描述如下: 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,
使得所有 小于 x 的节点都出现在 大于或等于 x
的节点之前。

注意:你不需要 保留 每个分区中各节点的初始相对位置。

在这里插入图片描述

点击跳转:分割链表


二、算法思想

(一)值交换

1、题目解析

本题要求我们将链表中的数值进行重构,大于x的值都在小于x的值之前。
我们之前学习数组的时候使用过双指针的解法,一个front指针从前往后遍历,找到一个大于x的值就停下来,之后让back指针从后往前遍历,遇到小于x的值就和front中的值进行交换,之后front指针继续遍历,直到两指针相遇为止。
这里题目没有限制不可以开辟额外空间,那么我们就可以将链表中的数据放到数组中,交换结束后在拷贝回链表中。
此时的时间复杂度为O(n),空间复杂度为O(n)。

动画演示如下:

双指针-- 数组

虽然借用数组来进行交换非常方便,
但是由于开辟数组这种方法空间复杂度较高,在很多情况下会受到限制,所以
这里我们不使用这种方法,不过可以使用双指针的思想:
设置两个指针,一个指针从头开始遍历,找到了数据大于x的节点后就让另一个节点从此处开始遍历,找到一个数据小于x的节点,之后交换两节点的数据。

动画演示如下:

双指针--链表

2、代码实现

代码如下:


typedef struct ListNode LN;

LN* partition(LN* head, int x) {
    if(!head || !head->next)
    {
        return head;
    }

   LN*less=head;
   LN*grea=head;
   while(less)
   {
       if(less->val>=x)
       {
           grea=less->next;
           while(grea)
           {
               if(grea->val<x)
               {
                   int tmp=grea->val;
                   grea->val=less->val;
                   less->val=tmp;
                   break;
               }
               grea=grea->next;
           }
       }
       if(!grea)
       break;
           less=less->next;
   }
   return head;
}

运行实例:
在这里插入图片描述
时间复杂度O(n),空间复杂度O(1),时间复杂度虽然看起来是O(n),但如果遇到前面都是大于x的数,后面都是小于x的数,
那么指针grea就需要遍历n/2次,时间复杂度近似与O(n^2)了已经,复杂度也很高的。


(二)重构链表

1、题目解析

上面我们交换的是节点中的数据,可是一个节点里不仅有数据域还有指针域,
那么我们能否通过改变指针的指向来改变链表呢?
下面让我们来尝试一下:
1.我们可以直接在原链表中进行更改;
2.创建一个新的链表,记录下小于x的最后一个节点和大于x的最后一个节点,之后分别进行尾插;
3.我们也可以创建两个新的链表,小于x节点连到一起,大于x的节点连到一起,
之后再将两个链表进行连接就可以了。(我们使用这种)

动画演示如下:

重构链表

2、代码实现

示例:


typedef struct ListNode LN;

LN* partition(LN* pHead, int x) {
	if (!pHead)
		return pHead;

	LN* lessHead = (LN*)malloc(sizeof(LN)); // 小于x的新链表
	lessHead->next = NULL;
	LN* greaHead = (LN*)malloc(sizeof(LN)); // 大于等于x的新链表
	greaHead->next = NULL;

	LN* pless = lessHead;
	LN* pgrea = greaHead;
	LN* cur = pHead;

	while (cur)
	{
		if (cur->val < x)
		{
			pless->next = cur;
			pless = pless->next;
		}
		else
		{
			pgrea->next = cur;
			pgrea = pgrea->next;
		}

		cur = cur->next;
	}

	pgrea->next = NULL; // 最后一个节点的next置空
	pless->next = greaHead->next; // 链接
	pHead = lessHead->next;

	free(lessHead);
	free(greaHead);

	return pHead;
}

运行实例:
在这里插入图片描述
此方法的时间复杂度为O(n),空间复杂度为O(1),并且不论是哪一种情况都只会遍历一次。
视频中只演示了既存在大于x的值也存在小于x的值的情况,
这里我们还需要注意:
所有值都大于x,和所以值都小于x这两种特殊情况,如果感兴趣的话大家之后可以自行画图测试。


总结

以上就是今天分割链表题目的全部内容,题目不难,也不难讲。
不过如果总结一下我们会发现:
这简简单单的一道题我们一共就说了5种方法,而且我想大家肯定也会有自己的一些特殊的想法的,所以
我们不能仅限于解决问题,一个简单的题目我们可以通过各种各样的方法来解决,
我们还需要考虑使用什么方法可以使问题解决更加优雅、更加高效。
如果有什么疑问或者建议都可以在评论区留言,感谢大家对在这里插入图片描述的支持。

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

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

相关文章

MySQL事务隔离级别

MySQL的四种隔离级别 读未提交读提交可重复读串行化 隔离级别可以通过MySQL的视图来实现。 读未提交 读未提交是一个事务仅修改了数据但还未提交时&#xff0c;本次修改可以便可被其他事务查询到变更后的值。读未提交隔离级别下&#xff0c;其他事务进行查询时&#xff0c;直…

新手小白学JAVA 日期类Date SimpleDateFormat Calendar

Date日期类 类 Date 表示一个特定的瞬间&#xff0c;精确到毫秒 1.1 Date的构造函数 Date() 分配一个 Date 对象&#xff0c;以表示分配它的时间&#xff08;精确到毫秒&#xff09; Date(long date) 分配一个 Date 对象&#xff0c;表示自从标准基准时间起指定时间的毫秒数 标…

【Java实验五】继承与多态

一、实验一 对于父类的含参构造方法&#xff0c;子类必须通过super调用&#xff0c;重写父类的构造方法 设计一个应用程序要求&#xff1a; 设计一个表示二维平面上点的类Point&#xff0c;包含有表示坐标位置的protected类型的成员变量x和y&#xff0c;获取和设置x和y值的publ…

SpringBoot项目的创建(三):手动创建一个Maven工程,然后引入SpringBoot所需的dependency来完成 (不需联网,但复杂)

SpringBoot项目的创建1.配置Maven环境。2.创建一个新的maven项目3.创建出来的目录结构4 继承springboot父项目5.添加Spring Boot Maven插件6.添加spring和web模块的依赖7.创建入口类8.添加代码测试1.配置Maven环境。 在以maven方式创建Spring Boot项目之前&#xff0c;需要先确…

交换网络基础

交换网络基础网络基础交换机的转发行为数据帧分类交换机MAC地址表ping包来回过程VLAN概念&#xff1a;VLAN接口类型ICMP返回值网络基础 路由器&#xff1a;基于3层路由表转发交换机&#xff1a;基于2层MAC地址表转发&#xff0c;数据帧转发 交换机的转发行为 泛洪&#xff1…

Buffer Pool Size of Total RAM No data

1.问题描述 1)问题现象 通过prometheus监控mysql实例和服务器&#xff0c;使用grafana做可视化展示&#xff0c;grafana 中添加 7362 号dashboard 作为mysql看板&#xff0c;添加 11074 号dashboard 作为主机看板。但是添加后查看 MySQL Overview 看板发现 Buffer Pool Size …

Python制作GUI学生管理系统毕设,大学生总会用得到

有很多可爱的大学生跟我吐槽&#xff1a; 咋这个大学跟我想象的不一样呢&#xff1f; 老师叫我们自己做… 还是那句话&#xff0c;技术才是硬道理 源码、资料电子书文末名片获取 有个经典案例就是 学生管理系统 写完了放在那也是放着&#xff0c;所以今天分享给大家吧&…

2022第四届长安杯复盘

容器加挂密码&#xff1a;2022.4th.changancup! 案件背景&#xff1a; 某地警方接到受害人报案称其在某虚拟币交易网站遭遇诈骗&#xff0c;该网站号称使用”USTD币“购买所谓的"HT币”&#xff0c;受害人充值后不但 “HT币”无法提现、交易&#xff0c;而且手机还被恶意…

PID算法

目录 一、PID算法 二、模拟PID 模拟PID调节器的控制规律为 模拟PID调节器的传递函数为 三、数字PID P控制 PI控制 PD控制 PID控制 数字PID增量型控制算式 PID位置型控制算式 一、PID算法 PID控制是最早发展的自动控制策略之一&#xff0c;是微机化控…

C++ opencv图像存储和MAT容器

1.图像在内存之中的存储方式: 图像矩阵的大小取决于所用的颜色模型&#xff0c;确切说&#xff0c;取决于所用通道数。如果是灰度图像&#xff0c;矩阵就会如图5.1所示。 对于多通道图像来说&#xff0c;矩阵中的列会包含多个子列&#xff0c;其子列个数与通道数相同&#xf…

【运筹优化】结合天际线启发式的蚁群算法求解二维矩形装箱问题 + Java代码实现

文章目录一、天际线启发式二、蚁群算法结合天际线启发式2.1 构建序列2.1.1 思路一2.1.2 思路二2.1.3 思路N三、Java代码实现3.1 项目结构3.2 Ant3.3 ACO3.4 Run3.5 运行结果展示3.5.1 思路一3.5.2 思路二3.5.3 思路N四、小结一、天际线启发式 关于天际线启发式的介绍请看我的另…

推荐算法---矩阵分解

矩阵分解报告 1. 试验介绍 矩阵分解就是把原来的大矩阵&#xff0c;近似的分解成小矩阵的乘积&#xff0c;在实际推荐计算时不再使用大矩阵&#xff0c;而是使用分解得到的两个小矩阵。具体来说就是&#xff0c;假设用户物品的评分矩阵R是m乘n维&#xff0c;即一共有m个用户&…

Redis资料整理

Redis--->是非关系型数据库(也称缓存数据库),是一种NoSQL数据库 存放5种数据类型 String key-value形式 另外list,set,zset,hash 另外两种不常用的:bitmap(位图类型),geo(地理位置类型),另外Redis5.0新增 stream类型 相对来说Redis适合存放少数据量的数据,如果需要存放…

BERT知识蒸馏TinyBERT

1. 概述 诸如BERT等预训练模型的提出显著的提升了自然语言处理任务的效果&#xff0c;但是随着模型的越来越复杂&#xff0c;同样带来了很多的问题&#xff0c;如参数过多&#xff0c;模型过大&#xff0c;推理事件过长&#xff0c;计算资源需求大等。近年来&#xff0c;通过模…

PX4基本配置

目录 下载固件 下载原生稳定版固件 安装PX4 Master, Beta或自定义固件 FMUv2 Bootloader 更新 机架设置 飞行控制器/传感器方向 计算朝向 设置朝向 罗盘校准 执行校准 陀螺仪校准 # 执行校准 加速度计 执行校准 空速计校准 执行校准 水平平面校准 执行校准 …

Spring Cloud Zookeeper 升级为Spring Cloud Kubernetes

这里是weihubeats,觉得文章不错可以关注公众号小奏技术&#xff0c;文章首发。拒绝营销号&#xff0c;拒绝标题党 背景 现有的微服务是使用的Spring Cloud Zookeeper这一套&#xff0c;实际应用在Kubernetes中部署并不需要额外的注册中心&#xff0c;本身Kubernetes自己就支持…

10道不得不会的 Java容器 面试题

博主介绍&#xff1a; &#x1f680;自媒体 JavaPub 独立维护人&#xff0c;全网粉丝15w&#xff0c;csdn博客专家、java领域优质创作者&#xff0c;51ctoTOP10博主&#xff0c;知乎/掘金/华为云/阿里云/InfoQ等平台优质作者、专注于 Java、Go 技术领域和副业。&#x1f680; 最…

FFmpeg内存IO模式

ffmpeg 支持从网络流 或者本地文件读取数据&#xff0c;然后拿去丢给解码器解码&#xff0c;但是有一种特殊情况&#xff0c;就是数据不是从网络来的&#xff0c;也不在本地文件里面&#xff0c;而是在某块内存里面的。 这时候 av_read_frame() 函数怎样才能从内存把 AVPacket…

TensorFlow的GPU使用相关设置整理

前言 TensorFlow是一个在机器学习和深度学习领域被广泛使用的开源软件库&#xff0c;用于各种感知和语言理解任务的机器学习。 默认情况下&#xff0c;TensorFlow 会映射进程可见的所有 GPU&#xff08;取决于 CUDA_VISIBLE_DEVICES&#xff09;的几乎全部内存。这是为了减少内…

国考省考行测:问题型材料主旨分析,有问题有对策,主旨是对策,有问题无对策,要合理引申对策

国考省考行测&#xff1a;问题型材料主旨分析&#xff0c;有问题有对策&#xff0c;主旨是对策&#xff0c;有问题无对策&#xff0c;要合理引申对策 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&#xff0c;而常规国考…