【数据结构】--单链表力扣面试题⑤链表分割

news/2024/10/31 3:20:46/

目录

一、有相对顺序的链表分割

二、无相对顺序的链表分割


一、有相对顺序的链表分割

题述:现有一链表的头指针ListNode* phead,给一定值x,编写一段代码将所有<x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排序后的链表的头指针。

示例如下:

思路:难就难在不能改变相对顺序。那我们的思路是创建两个链表,一个链表尾插<x的值,一个链表尾插>x的值,然后再把两个链表顺序链接即可。并且我们还会给两个链表定义尾指针,lessTail和greaterTail,并且会开辟一个头结点,这两个操作都是为了方便尾插。没有头结点还要多加一个判断。

 

 

但是如果开辟头结点,还要多两个操作:

1、我们题中默认都是没有头结点的,如果要返回头指针,他一定是要返回头结点的下一节点的地址,并且在两个链表链接过程中,一定是链接后面的头结点后的那一个节点。

2、要释放节点的内存,要返还给操作系统。

小知识:一般上oj上是不会限制空间复杂度的,如果出现报错,内存限制:您的程序使用了超出限制的内存。这种问题可能是由死循环等的问题造成的。

#include<stdio.h>
#include<stdlib.h>struct ListNode
{int val;struct ListNode* next;
};
struct ListNode* partition(struct ListNode* phead, int x)
{struct ListNode* lessHead, * lessTail, * greaterHead, * greaterTail;lessHead = lessTail = (struct ListNode*)malloc(sizeof(struct ListNode));//开辟一个头结点,使头指针和尾指针都指向头结点,以便遍历链表greaterHead = greaterTail = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* cur = phead;//用cur来遍历原链表while (cur)//结束条件一定是遍历完原链表{if (cur->val < x){lessTail->next = cur;lessTail = cur;}else{greaterTail->next = cur;greaterTail = cur;}cur = cur->next;//无论如何,链接完一个结点后都要往下走一次}lessTail->next = greaterHead->next;//将>=x的链表链接在<x的链表后面。//这里是=greaterHead->next的原因是greaterHead是头结点,是你自己开辟的,题里面不要这个!greaterTail->next = NULL;//使>=x的链表最后指向是NULL,防止构成环形链表struct ListNode* newnode = lessHead->next;//因为lessHead是头结点,我们不要!free(lessHead);//因为lessHead始终指向头结点,所以直接释放free(greaterHead);return newnode;
}
int main()
{struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* n2 = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* n3 = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* n4 = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* n5 = (struct ListNode*)malloc(sizeof(struct ListNode));int k = 5;n1->val = 1;n2->val = 2;n3->val = 4;n4->val = 3;n5->val = 9;n1->next = n2;n2->next = n3;n3->next = n4;n4->next = n5;n5->next = NULL;struct ListNode* obj = partition(n1, k);while (obj){printf("%d", obj->val);obj = obj->next;}return 0;
}

运行代码如下:

如果不要求相对顺序呢?

二、无相对顺序的链表分割

示例: 

 思路:给一个头head和一个尾tail,<x值的头插,>=x值的尾插即可实现。毕竟不要求相对顺序。只要求<x的节点在前面,>=x的节点在后面即可。

并且既要头插又要尾插的话就不建议创建一个头结点了,因为夹在中间,他还没用,会造成妨碍。

#include<stdio.h>
#include<stdlib.h>struct ListNode
{int val;struct ListNode* next;
};
struct ListNode* partition(struct ListNode* phead, int x)
{struct ListNode* head = NULL, * tail = NULL;struct ListNode* cur = phead,* prev = NULL;while (cur){if (cur->val < x){//头插要判断,如果是在中间头插,先要保存cur的下一个节点的地址才行if (head == NULL){head = tail = cur;cur = cur->next;}else{prev = cur->next;cur->next = head;head = cur;cur = prev;}}else{//尾插就不需要考虑太多了if (head == NULL){head = tail = cur;}else{tail->next = cur;tail = cur;}cur = cur->next;}}return head;
}
int main()
{struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* n2 = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* n3 = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* n4 = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* n5 = (struct ListNode*)malloc(sizeof(struct ListNode));int k = 5;n1->val = 1;n2->val = 2;n3->val = 4;n4->val = 3;n5->val = 9;n1->next = n2;n2->next = n3;n3->next = n4;n4->next = n5;n5->next = NULL;struct ListNode* obj = partition(n1, k);while (obj){printf("%d", obj->val);obj = obj->next;}return 0;
}

 


http://www.ppmy.cn/news/98692.html

相关文章

【Java校招面试】实战面经(十)

目录 前言一、TCP报头中都有什么,UDP报头中都有什么?二、单例模式的各种实现三、非静态内部类持有外部类的引用造成内存泄露的问题四、JDBC、Tomcat为什么要破坏双亲委派模型?五、如何快速判断某 URL 是否在 20 亿的网址 URL 集合中?六、B extends A时,类中的代码加载关系…

【PowerShell】PowerShell 7.1 之后版本的安装

当前以下操作系统支持PowerShell 7.1 版本的安装,非Windows 系统支持的版本和要求有一定的限制。 Windows 8.1/10 (including ARM64)Windows Server 2012 R2, 2016, 2019, and Semi-Annual Channel (SAC)Ubuntu 16.04/18.04/20.04 (including ARM64)Ubuntu 19.10 (via Snap pa…

k8s 对已完成job自动清理

job在处理完一个任务以后&#xff0c;状态会变成Completed&#xff0c;job在状态为Completed的时候默认不会自动清理的&#xff0c;还会继续占用系统资源。 TTL-after-finished控制器 kubernetes中有专门的控制器可以自动清理已完成的job,就是TTL-after-finished控制器。 TTL…

lwIP 开发指南

目录 lwIP 初探TCP/IP 协议栈是什么TCP/IP 协议栈架构TCP/IP 协议栈的封包和拆包 lwIP 简介lwIP 源码下载lwIP 文件说明 MAC 内核简介PHY 芯片介绍YT8512C 简介LAN8720A 简介 以太网接入MCU 方案 lwIP 无操作系统移植lwIP 带操作系统移植ARP 协议ARP 协议的简介ARP 协议的工作流…

Kubernetes部署+kubesphere管理平台安装

Kubernetes官网&#xff1b;kubesphere官网 不论是Kubernetes官网还是找的其它部署步骤&#xff0c;基本都是推荐搭建集群的方式&#xff0c;是为了实现高可用.....等等&#xff0c;这样一来至少需要两台或三台的服务器来搭建&#xff0c;这样对我们的成本也是非常大的&#xf…

【华为OD机试】水仙花数Ⅰ【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 所谓水仙花数,是指一个n位的正整数,其各位数字的n次方和等于该数本身。 例如153是水仙花数,153是一个3位数,并且153 = 1^3 + 5^3 + 3^3。 输入描述 第一行输入一个整数n,表示一个n…

码蹄杯语言基础:预处理命令(C语言)

⭐MT1100带参数的宏 请编写一个简单程序&#xff0c;把f(x)(x*x)定义成带参数的宏&#xff0c;计算f(9)/f(6)并输出结果。 格式 输入格式&#xff1a; 无 输出格式&#xff1a; 输出为实型 #include<stdio.h> #define f(x) ((x)*(x)) int main() {printf("%lf\n…

G0第23章:GORM基本示例、GORM Model定义、主键、表名、列名的约定

04 GORM基本示例 注意: 本文以MySQL数据库为例&#xff0c;讲解GORM各项功能的主要使用方法。 往下阅读本文前&#xff0c;你需要有一个能够成功连接上的MySQL数据库实例。 Docker快速创建MySQL实例 很多同学如果不会安装MySQL或者懒得安装MySQL&#xff0c;可以使用一下命令…