c语言-数据结构-链表分割

        链表分割实际上是给定一个值,遍历链表把链表中小于该值的节点与大于该值的节点分开,一般是将小于该值的节点放到链表的前面部分,大于该值的节点放在链表的后面部分。

        链表分割示意图如下:

        思路: 首先创建两条带哨兵位节点的新链表并且用big、small指针维护,比8大的节点放在big链表,比8小的节点放在small链表。

        两条新链表则需要创建两个哨兵位。哨兵位节点的作用顾名思义,仅仅是起到一个“站岗”的作用,也就是把要插入到新链表中的节点直接插到哨兵位节点的后面。

情况一:

        遍历链表,发现比8大的节点将其放到big哨兵位节点的后面,如下图:

        注意:这里不能直接让small和big指针进行遍历,因为如果这两个指针往后移动则找不到哨兵位节点的位置了,也就找不到链表的初始位置,还会面临内存泄漏的风险(因为哨兵位是malloc来的,没有哨兵位的位置就无法对其进行释放)。因此再定义两指针b_travel和s_travel代替移动,并且将cur指针移动至下一个节点。

情况二:

        若发现比8小的节点将其放到small哨兵位节点的后面,如下图:

        同理将cur指针至下一个节点, 每次拿下来一个节点都要更新b_travel和s_travel指针指向的位置。如此重复以上操作,直到cur指针指向NULL说明链表已遍历结束。

合并链表:

        接下来是最关键的一步,就是将small链表和big链表合二为一,最后返回small哨兵位的下一个节点的地址,即合并后链表的头节点地址。

         切记最后返回的是small哨兵位节点的下一个节点的地址,因为small和big开辟的哨兵位节点只是用于“站岗”,最后链表链接完成后需要将这两个哨兵位释放。

        铺垫了那么久接下来就是代码实现(测试代码包括链表的创建、打印以及链表分割功能):

#include<stdio.h>
#include<stdlib.h>typedef struct ListNode //创建节点结构体
{int data;//存放数据struct ListNode* next;//指向下一个节点
}ListNode;//链表分割函数
ListNode* partition(ListNode* head, int x) {struct ListNode* small = NULL;//开始先创建4个指针,两两维护链表struct ListNode* big = NULL;struct ListNode* s_travel = NULL;//这两个指针用于遍历链表struct ListNode* b_travel = NULL;//开辟两个哨兵位节点s_travel = small = (struct ListNode*)malloc(sizeof(struct ListNode));b_travel = big = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* cur = head;//用cur指针代替head遍历链表while (cur)//cur为空跳出循环{if (cur->data < x)//小于x的节点放到small链表中{s_travel->next = cur;s_travel = s_travel->next;}else//大于x的节点放到big链表中{b_travel->next = cur;b_travel = b_travel->next;}cur = cur->next;//cur往后走}b_travel->next = NULL;//合并链表s_travel->next = big->next;struct ListNode* poi = small;//记住small哨兵位节点的位置small = small->next;//small指向哨兵位后一个节点,也就是链表的头节点free(big);//释放哨兵位free(poi);return small;//返回链表头节点位置
}//打印链表函数
void Print(ListNode* phead)
{ListNode* cur = phead;while (cur){printf("%d->", cur->data);cur = cur->next;}printf("NULL");//模拟链表最后指向的是NULL
}int main()
{ListNode* n1 = (ListNode*)malloc(sizeof(ListNode));//创建5个节点,为了测试分割链表函数ListNode* n2 = (ListNode*)malloc(sizeof(ListNode));ListNode* n3 = (ListNode*)malloc(sizeof(ListNode));ListNode* n4 = (ListNode*)malloc(sizeof(ListNode));ListNode* n5 = (ListNode*)malloc(sizeof(ListNode));ListNode* plist = n1;//指向头节点的头指针plistn1->data = 12;//给每个节点都赋值n2->data = 6;n3->data = 23;n4->data = 18;n5->data = 2;n1->next = n2;//手动构建链表n2->next = n3;n3->next = n4;n4->next = n5;n5->next = NULL;Print(plist);//打印分割之前的链表ListNode* newhead = partition(plist, 8);//分割后返回新的头节点printf("\n分割后:");Print(newhead);//打印分割之后的链表return 0;
}

        运行结果:

结语:

        以上就是关于链表分割全部讲解与实现,其中对哨兵位节点合理的使用可以很方便解决某些链表问题,这种思路在链表问题中尤为重要,希望本文可以对你起到帮助。 

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

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

相关文章

CSDN每日一题学习训练——Java版(字符串相乘、子集、删除链表的倒数第 N 个结点)

版本说明 当前版本号[20231112]。 版本修改说明20231112初版 目录 文章目录 版本说明目录字符串相乘题目解题思路代码思路补充说明参考代码 子集题目解题思路代码思路参考代码 删除链表的倒数第 N 个结点题目解题思路代码思路参考代码 字符串相乘 题目 给定两个以字符串形…

【Linux】第十六站:进程地址空间

文章目录 一、程序地址空间1.内存的分布2.static修饰后为什么不会被释放3.一个奇怪的现象 二、进程地址空间1.前面现象的原因2.地址空间究竟是什么&#xff1f;3.为什么要有进程地址空间4.页表5.什么叫进程&#xff1f;6.进程具有独立性。为什么&#xff1f;怎么做到呢&#xf…

解决 Django 开发中的环境配置问题:Windows 系统下的实战指南20231113

简介&#xff1a; 在本文中&#xff0c;我想分享一下我最近在 Windows 环境下进行 Django 开发时遇到的一系列环境配置问题&#xff0c;以及我是如何一步步解决这些问题的。我的目标是为那些可能遇到类似困难的 Django 开发者提供一些指导和帮助。 问题描述&#xff1a; 最近…

2023.11.14-hive之表操作练习和文件导入练习

目录 需求1.数据库基本操作 需求2. 默认分隔符案例 需求1.数据库基本操作 -- 1.创建数据库test_sql,cs1,cs2,cs3 create database test_sql; create database cs1; create database cs2; create database cs3; -- 2.1删除数据库cs2 drop database cs2; -- 2.2在cs3库中创建…

Spark数据倾斜优化

1 数据倾斜现象 1、现象 绝大多数task任务运行速度很快&#xff0c;但是就是有那么几个task任务运行极其缓慢&#xff0c;慢慢的可能就接着报内存溢出的问题。 2、原因 数据倾斜一般是发生在shuffle类的算子&#xff0c;比如distinct、groupByKey、reduceByKey、aggregateByKey…

链表相关部分OJ题

&#x1f493;作者简介&#x1f44f;&#xff1a;在校大二迷茫大学生 &#x1f496;个人主页&#x1f389;&#xff1a;小李很执着 &#x1f497;系列专栏&#xff1a;Leetcode经典题 每日分享&#xff1a;人总是在离开一个地方后开始原谅它❣️❣️❣️———————————…

【Hadoop】MapReduce详解

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f…

nodejs+vue+python+PHP+微信小程序-安卓-房产中介管理信息系统的设计与实现-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

华为笔记本电脑原装win10/win11系统恢复安装教程方法

华为电脑matebook 14原装Win11系统带F10智能还原 安装恢复教程&#xff1a; 1.安装方法有两种&#xff0c;一种是用PE安装&#xff0c;一种是华为工厂包安装&#xff08;安装完成自带F10智能还原&#xff09; 若没有原装系统文件&#xff0c;请在这里获取&#xff1a;https:…

EasyDarwin开源流媒体服务器

文章目录 前言一、EasyDarwin 简介二、EasyDarwin 主要功能特点三、安装部署四、推拉流测试1、进入控制页面2、推流测试3、拉流测试 前言 本文介绍一个十分实用的高性能开源 RTSP 流媒体服务器&#xff1a;EasyDarwin。 一、EasyDarwin 简介 EasyDarwin 是基于 go 语言研发&a…

海康Visionmaster-通讯管理:使用 Modbus TCP 通讯 协议与流程交互

使用 Modbus TCP 通讯协议与视觉通讯&#xff0c;当地址为 0000 的保持型寄存器(4x 寄存器)变为 1 时&#xff0c;触发视觉流程执行一次&#xff0c;同时视觉将地址为 0000 的寄存器复位&#xff08;也即写为 0&#xff09;&#xff0c;视觉流程执行完成后&#xff0c;将结果数…

向量数据库的分类概况

保存和检索矢量数据的五种方法&#xff1a; 像 Pinecone 这样的纯矢量数据库 全文搜索数据库&#xff0c;例如 ElasticSearch 矢量库&#xff0c;如 Faiss、Annoy 和 Hnswlib 支持矢量的NoSQL 数据库&#xff0c;例如 MongoDB、Cosmos DB 和 Cassandra 支持矢量的SQL 数据库&am…

Redis键(Keys)

前言 在 Redis 中&#xff0c;键&#xff08;Keys&#xff09;是非常重要的概念&#xff0c;它们代表了存储在数据库中的数据的标识符。对键的有效管理和操作是使用 Redis 数据库的关键一环&#xff0c;它直接影响到数据的存取效率、系统的稳定性和开发的便利性。 本文将深入…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四)

编辑员工和分类模块功能开发 1. 编辑员工1.1 需求分析与设计1.1.1 产品原型1.1.2 接口设计 1.2 代码开发1.2.1 回显员工信息功能1.2.2 修改员工信息功能 1.3 功能测试 2. 分类模块功能开发2.1 需求分析与设计2.1.1 产品原型2.1.2 接口设计2.1.3 表设计 2.2 代码实现2.2.1 Mappe…

HarmonyOS开发(三):ArkTS基础

1、ArkTS演进 Mozilla创建了JS ---> Microsoft创建了TS ----> Huawei进一步推出ArkTS 从最初的基础逻辑交互&#xff08;JS&#xff09;,到具备类型系统的高效工程开发&#xff08;TS&#xff09;,再到融合声明式UI、多维状态管理等丰富的应用开发能力&…

【算法训练-链表 零】链表高频算法题看这一篇就够了

一轮的算法训练完成后&#xff0c;对相关的题目有了一个初步理解了&#xff0c;接下来进行专题训练&#xff0c;以下这些题目就是汇总的高频题目 题目题干直接给出对应博客链接&#xff0c;这里只给出简单思路、代码实现、复杂度分析 反转链表 依据难度等级分别为反转链表、…

Crypto | Affine password 第二届“奇安信”杯网络安全技能竞赛

题目描述&#xff1a; 明文经过仿射函数y3x9加密之后变为JYYHWVPIDCOZ&#xff0c;请对其进行解密&#xff0c;flag的格式为flag{明文的大写形式}。 密文&#xff1a; JYYHWVPIDCOZ解题思路&#xff1a; 1、使用在线网站直接破解或手工计算破解&#xff0c;获得flag。&#xf…

使用Nginx和uwsgi在自己的服务器上部署python的flask项目

Nginx 是一个高性能的 HTTP 和反向代理服务。其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力在同类型的网页服务器中表现较好。 Nginx 专为性能优化而开发&#xff0c;性能是其最重要的考量指标&#xff0c;实现上非常注重效率&#xff0c;能经受…

4.CentOS7安装MySQL5.7

CentOS7安装MySQL5.7 2023-11-13 小柴你能看到嘛 哔哩哔哩视频地址 https://www.bilibili.com/video/BV1jz4y1A7LS/?vd_source9ba3044ce322000939a31117d762b441 一.解压 tar -xvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz1.在/usr/local解压 tar -xvf mysql-5.7.44-…

lc307.区域和检索 - 数组可修改

暴力解法 创建方法&#xff0c;通过switch-case判断所需要调用的方法。 public class RegionsAndSertches {public static void main(String[] args) {String[] str new String[]{"NumArray", "sumRange", "update", "sumRange"};i…