【数据结构】_链表经典算法OJ:分割链表(力扣—中等)

目录

1. 题目描述及链接

2. 解题思路

2.1 思路1 

2.2 思路2

2.3 思路3(本题采取该解法)

3. 题解程序


1. 题目描述及链接

题目链接:面试题 02.04. 分割链表 - 力扣(LeetCode)

题目描述:

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你不需要 保留 每个分区中各节点的初始相对位置。

2. 解题思路

2.1 思路1 

创建结构体指针变量curNode遍历原链表:

当curNode的val值大于给定的X时,将该结点尾插后释放该结点;

当curNode的val值小于给定的X时,保持该结点不动,再检查下一结点;

2.2 思路2

重新创建一个新链表,并为其设置一个哨兵位。

创建指针变量curNode遍历原链表,当curNode的val值大于给定的X时,进行尾插操作;

当curNode的val值小于给定的X时,进行头插操作。

2.3 思路3(本题采取该解法)

总思路:

创建两个新链表:大链表和小链表。

创建指针变量curNode遍历原链表,当curNode的val值小于给定的X时,尾插到小链表;

当curNode的val值大于给定的X时,尾插到大链表;

具体思路:

(1)为实现大小链表的正确尾插,需要创建对应指针变量指向当前的尾结点,并在插入后更新尾结点。分别命名为greaterTail和lessTail;

(2)同时,新建链表为空时,空指针->next会导致空指针解引用。故而新链表为空需单独讨论,较为麻烦。此处采用设置哨兵位,分别记为greaterHead和greaterTail:

(3)由于创建了头结点(哨兵位),最后需手动释放;

(4)注意由于哨兵位并不存放实际有效的值,故大链表链接到小链表尾部时,实际链接的大链表第一个结点是greaterHead->next;最后返回新链表的第一个结点是lessHead->next;

(5)考虑特殊情况,若原链表为空,则大小链表仅有哨兵位,即greaterHead->next为NULL,lessTail->next也为NULL,直接返回NULL即可。

3. 题解程序

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode* partition(struct ListNode* head, int x) {if(head==NULL){return NULL;}// 创建两个带头链表ListNode* lessHead,*lessTail;ListNode* greaterHead,*greaterTail;lessHead=lessTail=(ListNode*)malloc(sizeof(ListNode));greaterHead=greaterTail=(ListNode*)malloc(sizeof(ListNode));// 遍历原链表,将结点分别尾插到大小链表ListNode* curNode=head;while(curNode!=NULL){if(curNode->val < x){// 尾插到小链表中lessTail->next=curNode;lessTail=lessTail->next;}else{// 尾插到大链表中greaterTail->next=curNode;greaterTail=greaterTail->next;}curNode=curNode->next;}greaterTail->next=NULL;// 链接大小链表:小前大后lessTail->next=greaterHead->next;// 存小链表第一个有效结点,并释放头结点ListNode* newHead=lessHead->next;free(lessHead);free(greaterHead);lessHead=lessTail=NULL;return newHead;
}

注意:

1、必须要将大链表的尾指针的next指针置为NULL,否则会成环,报错为超出时间限制

分析如下:

2、greaterTail->next=NULL 语句必须在 lessTail->next=greaterHead->next语句之前

假设跳出while循环后的代码顺序如下:

// 链接大小链表:小前大后
lessTail->next=greaterHead->next;
greaterTail->next=NULL;

提交报错如下:

这个错误表明程序试图访问一个未正确对齐的内存地址,

通常是由于结构体成员未正确初始化或内存分配问题导致的

考虑原链表为[1](单个结点),x=2的情况

由于在while循环中仅执行了if分支并没有执行else分支,

greaterHead仅调用malloc申请了空间,并未为其val及next赋值。

此时直接使用greaterTail->next为lessTail->next赋值,会导致赋值为随机值。

令greaterTail->next=NULL 语句在 lessTail->next=greaterHead->next语句之前,可以保证greaterHead和greaterTail被初始化为NULL。

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

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

相关文章

基于vue和elementui的简易课表

本文参考基于vue和elementui的课程表_vue实现类似课程表的周会议列表-CSDN博客&#xff0c;原程序在vue3.5.13版本下不能运行&#xff0c;修改两处&#xff1a; 1&#xff09;slot-cope改为v-slot 2&#xff09;return background-color:rgb(24 144 255 / 80%);color: #fff; …

【Unity3D】实现Decal贴花效果,模拟战旗游戏地形效果

目录 一、基础版 二、Post Process 辉光Bloom效果 矩形渐隐 涉及知识点&#xff1a;Decal贴花、屏幕后处理Bloom、屏幕空间构建世界空间、ChracterController物体移动、Terrain地形创建 一、基础版 Unity 2019.4.0f1 普通渲染管线&#xff08;非URP、非HDRP&#xff09; UR…

kotlin内联函数——runCatching

1.runCatching作用 代替try{}catch{}异常处理&#xff0c;用于捕获异常。 2.runCatching函数介绍 参数&#xff1a;上下文引用对象为参数返回值&#xff1a;lamda表达式结果 调用runCatching函数&#xff0c;如果调用成功则返回其封装的结果&#xff0c;并可回调onSuccess函…

数据结构与算法学习笔记----求组合数

数据结构与算法学习笔记----求组合数 author: 明月清了个风 first publish time: 2025.1.27 ps⭐️一组求组合数的模版题&#xff0c;因为数据范围的不同要用不同的方法进行求解&#xff0c;涉及了很多之前的东西快速幂&#xff0c;逆元&#xff0c;质数&#xff0c;高精度等…

基于物联网设计的疫苗冷链物流监测系统

一、前言 1.1 项目开发背景 随着全球经济的发展和物流行业的不断创新&#xff0c;疫苗和生物制品的运输要求变得越来越高。尤其是疫苗的冷链物流&#xff0c;温度、湿度等环境因素的控制直接关系到疫苗的质量和效力&#xff0c;因此高效、可靠的冷链监控系统显得尤为重要。冷…

学习数据结构(1)时间复杂度

1.数据结构和算法 &#xff08;1&#xff09;数据结构是计算机存储、组织数据的方式&#xff0c;指相互之间存在⼀种或多种特定关系的数据元素的集合 &#xff08;2&#xff09;算法就是定义良好的计算过程&#xff0c;取一个或一组的值为输入&#xff0c;并产生出一个或一组…

数据库表数据导出攻略:SQL脚本生成全解析

摘要 为了将SQL Server中的特定数据库表及其数据导出为SQL脚本&#xff0c;用户可以遵循一系列明确的步骤。首先&#xff0c;在SQL Server Management Studio中启动目标数据库&#xff0c;并通过右键菜单选择“任务”下的“生成脚本”。在向导中逐步操作&#xff0c;选择需要导…

基于RIP的MGRE实验

实验拓扑 实验要求 按照图示配置IP地址配置静态路由协议&#xff0c;搞通公网配置MGRE VPNNHRP的配置配置RIP路由协议来传递两端私网路由测试全网通 实验配置 1、配置IP地址 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 15.0.0.1 24 [R1]int LoopBack 0 [R1-LoopBack0]i…

获取加工视图下所有元素

UF_SETUP_ask_program_root //程序顺序 视图 UF_SETUP_ask_mct_root //机床视图 UF_SETUP_ask_mthd_root //加工方法视图 UF_SETUP_ask_geom_root //几何视图 UF_initialize();//初始化 UF_UI_ONT_refresh();//刷新加工导航器 UF_UI_open_listing_window(); tag_t …

C#实现SQL Server数据血缘关系生成程序

要在现有的C#程序中添加功能&#xff0c;输出SQL Server数据血缘关系的三张表到Excel文件&#xff0c;我们需要进行以下几个步骤&#xff1a; 分析存储过程、视图和函数中的引用关系&#xff0c;构建数据血缘关系。 按依赖性从小到大排序表的顺序。 找出对应生成表的数据的存储…

Oracle迁移DM数据库

Oracle迁移DM数据库 本文记录使用达梦官方数据迁移工具DTS&#xff0c;将Oracle数据库的数据迁移至达梦数据库。 1 数据准备 2 DTS工具操作步骤 2.1 创建工程 打开DTS迁移工具&#xff0c;点击新建工程&#xff0c;填写好工程信息&#xff0c;如图&#xff1a; 2.2 新建迁…

微服务(一)

文章目录 项目地址一、微服务1.1 分析User的Domian Verb和Nouns 二、运行docker和k8s2.1 Docker1. 编写dockerfile2. 创建docker image3. 运行docker使用指定端口4. 查看当前运行的镜像5. 停止当前所有运行的docker6. 删除不用的docker images7. 将本地的image上传到hub里 2.2 …

现代操作系统一点点

现代操作系统 操作系统为所有其他软件提供基础的运行环境。 操作系统包含很多用于控制输入/输出设备的驱动 文件也是抽象出来的 操作系统的一个主要任务是隐藏硬件&#xff0c;呈现给程序&#xff08;以及程序员&#xff09;良好、清晰、优雅、一致的抽象。 shell也是操作系统提…

分享|instructionfine-tuning 指令微调是提高LLM性能和泛化能力的通用方法

《生成式AI导论》课程中&#xff0c;李宏毅老师提到一篇关于“ instruction fine-tuning” 指令微调的论文&#xff1a; 《Scaling Instruction-Finetuned Language Models》 摘要分享&#xff1a; 事实证明&#xff0c; 在一组以指令形式表达的数据集上微调语言模型可以提…

python生成图片和pdf,快速

1、下载安装 pip install imgkit pip install pdfkit2、wkhtmltopdf工具包&#xff0c;下载安装 下载地址&#xff1a;https://wkhtmltopdf.org/downloads.html 3、生成图片 import imgkit path_wkimg rD:\app\wkhtmltopdf\bin\wkhtmltoimage.exe # 工具路径&#xff0c;安…

菜鸟之路Day09一一集合进阶(二)

菜鸟之路Day09一一集合进阶(二) 作者&#xff1a;blue 时间&#xff1a;2025.1.27 文章目录 菜鸟之路Day09一一集合进阶(二)0.概述1.泛型1.1泛型概述1.2泛型类1.3泛型方法1.4泛型接口1.5泛型通配符 2.Set系列集合2.1遍历方式2.2HashSet2.3LinkedHashSet2.4TreeSet 0.概述 内…

Hive:基本查询语法

和oracle一致的部分 和oracle不一样的部分 排序 oracle中,在升序排序中&#xff0c;NULL 值被视为最大的值&#xff1b;在降序排序中&#xff0c;NULL 值被视为最小的值。 在MySQL中&#xff0c;NULL 被视为小于任何非空值。 在Hive中, NULL是最小的; Hive除了可以用order…

在RHEL 8.10上安装开源工业物联网解决方案Thingsboard 3.9

在RHEL/CentOS/Rocky/AlmaLinux/Oracle Linux 8单节点上安装 备注&#xff1a; 适用于单节点 是否支持欧拉&#xff1f;&#xff1f;&#xff1f; 前提条件 本指南描述了如何在RHEL/CentOS 7/8上安装ThingsBoard。硬件要求取决于所选的数据库和连接到系统的设备数量。要在单…

Python GUI 开发 | PySide6 辅助工具简介

关注这个框架的其他相关笔记&#xff1a;Python GUI 开发 | PySide6 & PyQt6 学习手册-CSDN博客 在上一章中&#xff0c;我们介绍了如何搭建 PySide6 & PyQt6 的开发环境。在搭建环境的时候我们配置了几个几个快捷工具&#xff0c;很多小伙伴可能都不知道是干啥用的。那…