分隔链表(精美图示详解哦)
创始人
2024-05-31 20:23:45
0

全文目录

  • 引言
  • 分隔链表
    • 题目描述与思路
    • 实现
  • 总结

引言

前面,我们熟悉了管理链表中的数据的方法,也了解了几道与链表相关的题目:
戳我看单链表详解哦

在本篇文章中,我们将再了解一道题目:分隔链表:
分隔链表OJ链接

分隔链表

题目描述与思路

在这里插入图片描述
这道题要求我们实现将一个点链表中,val大于等于x的结点与val小于x的结点分隔:小于x的结点在大于x的结点前。并且原链表中的数据顺序不能发生改变。
即,若链表数据为1、4、3、2、5、2,x=3时,分隔后的链表为:1、2、2、4、3、5。

输入两个参数:链表的首结点地址head与分隔标准x。结构体变量与主函数部分已经定义,我们只需要实现接口即可。

不难想到,只要遍历整个链表,然后将val小于x的结点尾插到一个链表中,将val大于等于x的结点尾插到一个链表中。遍历结束后,再将两个链表连接起来即可。
又由于直接尾插时,当链表为空时,处理会比较麻烦,且还需要判断链表是否为空。用有哨兵位头结点的链表尾插即可:

实现

为了使代码更简洁,我们可以对结构体名称重命名:

typedef struct ListNode ListNode;

为实现这个算法,我们首先需要一个结构体指针cur,并将其初始化为head,用来遍历单链表:

ListNode* cur = head;

然后,我们需要4个指针,分别为val小于x的结点存放的链表的头结点地址与尾结点地址;val大于等于x的结点存放的链表的头节点地址与尾结点地址。将他们全部初始化为NULL:

ListNode* above = NULL;
ListNode* low = NULL;
ListNode* abovetail = NULL;
ListNode* lowtail = NULL;

然后,动态开辟两个哨兵位头节点的空间并断言其是否成功开辟:

above = abovetail = (ListNode*)malloc(sizeof(ListNode));
low = lowtail = (ListNode*)malloc(sizeof(ListNode));
assert(above && low);

然后,在将两链表头结点的next成员都初始化为NULL后(防止有某一链表为空时出现问题),就可以开始遍历了。

while循环遍历整个链表,条件为cur不为空:
若cur->val < x:
将lowtail->next改为cur,即连接low链表的尾结点与cur。然后lowtail=lowtail->next,即让lowtail指针向后移动一个结点,继续指向链表的尾结点。然后cur=cur->next,即cur向后移动一位;
若cur-> <= x:
将abovetail->next改为cur,即连接above链表的尾结点与cur。然后abovetail=abovetail->next,即让abovetail指针向后移动一个结点,继续指向链表的尾结点。然后cur=cur->next,即cur向后移动一位。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

遍历结束后,lowtail->next = above->next,即将above链表连接到low链表的后面。然后abovetail->next = NULL,即,将连接后的链表的尾结点的next成员改为NULL:

最后,free释放动态开辟的两块内存空间。但是由于释放后就不能返回值,所以先用一个ret指针记录low->next的值,等释放low与above指向的空间后,返回ret即可:
在这里插入图片描述

struct ListNode* partition(struct ListNode* head, int x)
{typedef struct ListNode ListNode;ListNode* cur = head;ListNode* above = NULL;ListNode* low = NULL;ListNode* abovetail = NULL;ListNode* lowtail = NULL;above = abovetail = (ListNode*)malloc(sizeof(ListNode));low = lowtail = (ListNode*)malloc(sizeof(ListNode));assert(above && low);above->next = low->next = NULL;while (cur){if (cur->val < x){lowtail->next = cur;lowtail = lowtail->next;cur = cur->next;}else{abovetail->next = cur;abovetail = abovetail->next;cur = cur->next;}}lowtail->next = above->next;abovetail->next = NULL;ListNode* ret = low->next;free(low);free(above);return ret;
}

总结

到此,关于分隔链表的介绍就结束了。
接下来会继续介绍链表的相关知识,欢迎大家持续关注哦

如果大家认为我对某一部分没有介绍清楚或者某一部分出了问题,欢迎大家在评论区提出

如果本文对你有帮助,希望一键三连哦

希望与大家共同进步哦

相关内容

热门资讯

我班的活雷锋三年级作文【通用... 我班的活雷锋三年级作文 篇一我们班的小雷锋在我们班级里,有一个特别的小朋友,他就是我们的活雷锋。他叫...
海边作文300字三年级(精选... 海边作文300字三年级 篇一我喜欢海边,因为海边有美丽的沙滩、清澈的海水和各种有趣的海洋生物。每年暑...
三年级作文上学的路上开头【实... 三年级作文上学的路上开头 篇一一大早,天空还是微微泛着蓝色的时候,我便背上了书包,踏上了上学的征程。...
不起眼的主角作文【优选3篇】 不起眼的主角作文 篇一《小草的故事》有一天,我在花园里散步,突然发现一株小草。它生长在花园的角落,显...
家乡的环境作文三年级300字... 家乡的环境作文三年级300字20篇 篇一标题:我家乡的美丽环境我家乡是一个美丽的小镇,它位于山脚下,...
爸爸的作文【优质6篇】 爸爸的作文 篇一爸爸的作文今天是我第一次写作文,我选择写一篇关于我的爸爸的作文。爸爸是我心目中最伟大...
参观洛阳周王城天子驾六博物馆... 参观洛阳周王城天子驾六博物馆三年级作文 篇一我去洛阳参观了周王城天子驾六博物馆,感受到了历史的厚重和...
关于老师的一件事200字作文... 关于老师的一件事200字作文三年级作文 篇一今天是我上三年级的第一天,我迫不及待地走进了教室,想要见...
香水百合(通用4篇) 香水百合 篇一:追寻芬芳之旅香水百合,一种散发着迷人芬芳的花朵,常常被人们用来制作香水。它的美丽和独...
我们是一家人学生作文500字... 我们是一家人学生作文500字 篇一我们是一家人家,是一个温暖的港湾,是一个永远的归宿。在这个家庭中,...
你是我最崇拜的人小学作文(经... 你是我最崇拜的人小学作文 篇一我最崇拜的人是我的爸爸。他是一个非常了不起的人,他不仅是我的爸爸,还是...
小V过生日小学作文【实用3篇... 小V过生日小学作文 篇一我的好朋友小V过生日了!今天是她的生日,我早早地就起床了,准备给她一个惊喜。...
住在我心里的人作文【实用3篇... 住在我心里的人作文 篇一我的父亲,住在我心里的人在我心中,有一个特别的角落,专门为我亲爱的父亲而设。...
打雪仗的小学作文(优选3篇) 打雪仗的小学作文 篇一:我和朋友们的欢乐雪战冬天来了,大地披上了洁白的雪衣。我和朋友们迫不及待地跑到...
中秋赏月的小学作文(优质6篇... 中秋赏月的小学作文 篇一中秋佳节,是我国传统的重要节日之一。这一天,我们会和家人、朋友一起赏月、吃月...
坐地铁和摘小番茄作文【优秀3... 坐地铁和摘小番茄作文 篇一坐地铁和摘小番茄我喜欢坐地铁,因为它是一种方便快捷的交通工具。每天上下班,...
两代鸟的交谈作文【推荐3篇】 篇一:两代鸟的交谈近日,我在公园里目睹了一场令人惊叹的景象,一只年轻的鸟儿和一只老年鸟儿正在愉快地交...
一年级关于英雄事迹的作文50... 一年级关于英雄事迹的作文500字 篇一:《我的英雄》我的英雄是我的爸爸。他是一位普通的上班族,每天都...
记一件事小学生作文(精彩6篇... 记一件事小学生作文 篇一我和小狗的故事今天,我要给大家讲一个关于我和小狗的故事。这个故事发生在我上小...
抗击新型肺炎作文【通用5篇】 抗击新型肺炎作文 篇一:团结一心,共克时艰新型冠状病毒肺炎疫情突如其来,给我们的生活带来了巨大的冲击...