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

news2024/11/18 5:47:13

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

        链表分割示意图如下:

        思路: 首先创建两条带哨兵位节点的新链表并且用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;//指向头节点的头指针plist
    n1->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.coloradmin.cn/o/1205017.html

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

相关文章

Topk问题!(面试高频常考)

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; 剑指offer &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言&#x1f324;️什么是Top-k问题&#xff1f;&#x1f324;️常见的Top-K问题类型☁️寻找…

Global_Mapper_Pro_25.0安装教程大全

一. 下载&#xff1a; http://dt1.8tupian.net/2/29913a55b1000.pg3二. 介绍&#xff1a; Global Mapper Pro 25是领先的GIS数据处理解决方案&#xff01;提供了一整套符合标准的功能来提升您的操作和技能&#xff0c;您可以最合理的利用您的工具集来完成以前复杂的工作任务&a…

深度学习AIR-PolSAR-Seg图像数据预处理

文章目录 深度学习sar图像数据预处理一.图片预处理操作1.log(1x)处理2.sqrt平方化处理 二.原网络训练效果展示原始数据训练效果展示&#xff1a; 三.对比实验1.采用原始数据2.采用取log(1x)后的数据3.采用取平方后归一化处理&#xff1a; 四.总结&#xff1a;五.思考 深度学习s…

揭秘 DCNN——AlexNet

来源 — gifs.com 一、说明 还记得 2012 年的 ImageNet 视觉识别挑战赛吗&#xff1f;当然&#xff0c;你知道&#xff01;经过大量的反复试验和实验&#xff0c;研究员 Alex Krizhevsky 及其合著者 Ilya Sutskever 和 Geoffrey E. Hinton&#xff08;他真正理解了深度学习中…

Windows没有USB启动选项很常见,但解决方法更常见

当试图在计算机上重新安装Windows 11/10操作系统,或从安装介质启动时,一些用户看到错误–系统没有任何USB启动选项,请在启动管理器菜单中选择其他启动选项。此错误出现在不同OEM的多个设备,原因包括启用了安全引导、禁用了Legacy/CSM支持、联想服务引擎、未正确制作可引导U…

万宾科技智能传感器EN100-C2有什么作用?

在日常生活中井盖是一种常见的城市设施&#xff0c;但井盖出现问题可能会对人们的生活造成什么影响呢&#xff1f;移位或老化的井盖可能会威胁人们的安全&#xff0c;同时也会影响城市生命线的正常运行。然而智能井盖的出现为解决这些问题提供了有效的应对方案。 WITBEE万宾智能…

Day44 力扣动态规划 : 300.最长递增子序列|674. 最长连续递增序列 | 718. 最长重复子数组

Day44 力扣动态规划 : 300.最长递增子序列&#xff5c;674. 最长连续递增序列 &#xff5c; 718. 最长重复子数组 300.最长递增子序列第一印象看完题解的思路dp递推公式遍历顺序初始化 实现中的困难感悟代码 674. 最长连续递增序列第一印象dp状态转移公式遍历顺序初始化 看完题…

能够定时发送朋友圈的软件

此款软件提供便捷的网页端登录方式&#xff0c;让您轻松管理多个账号&#xff0c;实现多账号聚合管理&#xff0c;只需一个界面即可解决所有问题。 朋友圈内容编辑功能强大&#xff0c;让您在输入框内输入文本内容&#xff0c;点击表情图标选择表情&#xff0c;还能通过“”图标…

Go利用反射实现一个ini文件的解析器程序

package mainimport ("bufio" // 逐行读取配置文件"fmt""log""os""reflect""strconv""strings" )type Config struct { // 定义配置结构体Section1 Section1 ini:"section1" // 嵌套结构体1…

洗地机哪个牌子最好用?洗地机怎么选?2023洗地机选购推荐

家里有小孩或者是养有宠物的都有一个深刻的体验&#xff0c;那就是房子每天都很乱&#xff0c;隔三岔五就得做一次卫生清理、地板杀菌等。如果是房屋面积太大的话&#xff0c;只靠自己手动清洁是非常的耗时间并且还很劳累。洗地机的出现可谓是造福人类&#xff0c;解脱了家庭劳…

EM@一次双绝对值不等式

文章目录 一次双绝对值不等式求解步骤去绝对值情况分析&#x1f47a;例例代数法几何方法比较 例 一次双绝对值不等式求解步骤 设 f ∣ f 1 ∣ ∣ f 2 ∣ f|f_1||f_2| f∣f1​∣∣f2​∣, f 1 , f 2 f_1,f_2 f1​,f2​都是一次多项式,则原不等式 f ⩾ a f\geqslant{a} f⩾a或 …

跨越编程界限:C++到JavaSE的平滑过渡

JDK安装 安装JDK 配置环境变量&#xff1a; Path 内添加 C:\Program Files\Java\jdk1.8.0_201\bin 添加 JAVA_HOME C:\Program Files\Java\jdk1.8.0_201 添加 CLASSPATH .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 第一个Java程序 HelloWorld.java public class…

记录--让我们来深入了解一下前端“三清”是什么

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前端“三清” 在前端开发中&#xff0c;我们经常听到关于“三清”的说法&#xff0c;即 window、document、Object。这三者分别代表了 BOM(浏览器对象模型)、DOM(文档对象模型)以及 JS 的顶层对象。在…

Git精讲(一)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、Git初识1、提出问题2、如何解决--版本控制器3、注意事项 二、Git 安装1、Linux-centos2、…

世微 升压恒压IC dc-dc转换器 充电器手持设备便携式产品 AP8660

AP8660是一款升压dc-dc转换器&#xff0c;内置MOS调节器&#xff0c;内部补偿&#xff0c;还可以最小6个外部组件&#xff0c;内部的软识启动功能可以降压涌入电流 AP8660 SOT23-6封装&#xff0c;可以为PCB提供节省空间 特点 可调输出&#xff0c;最高达到24W 内部固定PWM频…

语言大模型的预训练过程——从无尽数据到海量知识

从目前研究结果看&#xff0c;Transformer是足够强大的特征抽取器&#xff0c;通过预训练过程&#xff0c;Transformer学到了什么&#xff1f;知识是如何存取的&#xff1f;我们又如何修正错误知识&#xff1f;本文讲述这方面的研究进展。 1、求知&#xff1a;LLM学到了什么知…

【JAVA】去掉 if...else 的七种绝佳之法...

文章目录 前言方法一&#xff1a;提前 return方法二&#xff1a;枚举方案三&#xff1a;Optional 判空方案四&#xff1a;表驱动法方案五&#xff1a;策略模式 工厂方法方案六&#xff1a;责任链模式方案七&#xff1a;Function总结 前言 我相信小伙伴一定看过多篇怎么去掉 i…

解决渗透测试js文件泄露

解决办法&#xff1a;使用过滤器过滤 public class StaticSourceFilter implements Filter {private static Logger logger LoggerFactory.getLogger(StaticSourceFilter.class);Overridepublic void init(FilterConfig filterConfig) throws ServletException {}Overridepub…

http-server安装使用

前段时间给电脑重装了系统&#xff0c;很多东西都没了&#xff0c;今天想在浏览器打开一个本地的html文件&#xff0c;发现电脑上没有http-server&#xff0c;于是装了一个&#xff0c;并且记录下安装过程 1、安装 nodejs&#xff0c;但如果你电脑上有&#xff0c;就无需下载 …

html5 初步了解

1、html5 含义 简而言之&#xff0c;html5 其实就是新的一代html标准&#xff01; 2、html5的优缺点 优点 语义化html 增加了很多语义化的标签&#xff0c;让html结构更加清晰&#xff0c;更具可读性由于增加了很多语义化的标签&#xff0c;对SEO更加友好 缺点 其他主流浏…