C语言单链表OJ题(较难)
一、链表分割
牛客网链接
题目描述:
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
思路:
题目中要求不能改变原来的数据顺序,所以不能采用交换的方法写,应该单独创建两个链表,第一个链表尾插小于x的数据,另外一条链表尾插大于x的数据,最后将这两条链表进行链接。
尾插不改变原来数据顺序,头插将原来的数据顺序逆置。
我们引用哨兵卫头结点解决这道题会更加方便。
不仅方便尾插,不需要分类判断空指针与否,而且也避免两个链表链接时第一个链表为空的情况。

TIP:
一般尾插时,最后一个结点的next容易出现问题,我们一般需要自己将其置成空指针
代码:
#include <cstddef>
#include <cstdlib>
class Partition {
public:ListNode* partition(ListNode* pHead, int x) {struct ListNode* ghead,*gtail,*lhead,*ltail;//使用哨兵卫的头结点更加简单ghead=gtail=(struct ListNode*)malloc(sizeof(struct ListNode));lhead=ltail=(struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* cur=pHead;while(cur){if(cur->val < x){ltail->next=cur;ltail=ltail->next;}else {gtail->next=cur;gtail=gtail->next;}cur=cur->next;}gtail->next=NULL;//滞空,不然可能导致环形链表的出现ltail->next=ghead->next;struct ListNode* newhead=lhead->next;free(ghead);free(lhead);return newhead;}
};
二、链表的回文结构
牛客网链接
题目描述:
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例:
1->2->2->1
返回:true
思路:
因为单链表只能从一个方向开始遍历,所以先让一串链表从中间结点开始往后逆置,接着两端链表进行比较。从中间结点开始逆置需要找中间结点,逆置也是之前讲过的,相当于再次复习巩固一遍
代码:
#include <cstddef>
class PalindromeList {
public:bool chkPalindrome(ListNode* head) {//寻找中间结点struct ListNode* fast=head;struct ListNode* slow=head;while(fast&&fast->next){fast=fast->next->next;slow=slow->next;}//从中间结点开始逆置struct ListNode* newhead=NULL;struct ListNode* cur=slow;struct ListNode* next=NULL;while(cur){next=cur->next;cur->next=newhead;newhead=cur;cur=next;}//开始判断while(head && newhead){if(head->val!=newhead->val){return false;}head=head->next;newhead=newhead->next;}return true;}
};
三、相交链表
leetcode链接
题目描述:
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:

题目数据 保证 整个链式结构中不存在环。
思路:
首先有一个暴力解法,从第一条链表开始,将每一个结点的地址与第二条链表比较,直到找到相同的为止,这样的时间复杂度就是O(N^2),不太理想,下面将一个O(N)的算法:
首先判断有无相交结点,直接遍历两条链表,看尾结点的地址是否相同。
如果相同,则计算两条链表的结点的差值,接着让长的链表先走差值步,这时因为相交结点后面的个数一定相同,长的链表走差值步后,相交结点的前面也是相同个数的结点,直接一一比较地址是否相同,就不用遍历两遍了,也就是O(N)。
代码:
truct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{struct ListNode* curA=headA;struct ListNode* curB=headB;int numA=1;int numB=1;//判断是否有相交的结点while(curA->next){curA=curA->next;numA++;}while(curB->next){curB=curB->next;numB++;}if(curA!=curB){return NULL;}int gap=abs(numA-numB);//直接假设长链表,不用if语句struct ListNode* longlist=headA;struct ListNode* shortlist=headB;if(numA<numB){longlist=headB;shortlist=headA;}//长的先走差距步,走gap步就是后置--while(gap--){longlist=longlist->next;}//在已知有公共结点的情况下,遍历返回while(1){if(longlist==shortlist){return longlist;}longlist=longlist->next;shortlist=shortlist->next;}
}
四、环形链表
leetcode链接
题目描述:
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。

思路:
本题要求较为简单,只需要判断是否含有环形结构,我们还是利用快慢指针的思想,快指针走两步,慢指针走一步,如果不带环,则快指针作为循环判断的条件,如果带环,则最后两者肯定会相遇,直到快慢指针地址相同时跳出循环。
代码:
bool hasCycle(struct ListNode *head)
{struct ListNode* slow=head;struct ListNode* fast=head;while(fast && fast->next){slow=slow->next;fast=fast->next->next;if(slow==fast){return true;}}return false;
}
五、环形链表(进阶)
142. 环形链表 II - 力扣(LeetCode)
题目描述:
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
思路一:
本题主要找环形链表进入环的第一个节点,当然需要判断是不是环形链表,判断后需要进行一个数学的函数证明


经过计算验证,我们发现一个指针从起点走,另外一个从相遇点走,在相同步伐下,他们会在入口点相遇!
有这样一个等式,接下来就只需要找相遇点,正好上一题我们就找的是相遇点。
代码:
struct ListNode *detectCycle(struct ListNode *head)
{struct ListNode* slow = head;struct ListNode* fast = head;struct ListNode* meet = NULL;struct ListNode* cur = head;//先判断是否有环while(fast&&fast->next){slow=slow->next;fast=fast->next->next;if(slow==fast){//找到相遇结点meet = slow;break;}}if(meet==NULL){return NULL;}//相遇节点与头结点一起走,直到相等,就是入口while(1){if(meet==cur){return meet;}meet=meet->next;cur=cur->next;}
}
思路二:
利用相交链表的思路。
首先也是找到相遇点,然后将相遇点的后面的结点断掉,这样就形成了两个链表,一条链表从头结点开始,另一条链表从断口开始。并且这两个链表的交点就是我们的入口点!

struct ListNode *detectCycle(struct ListNode *head)
{struct ListNode* slow = head;struct ListNode* fast = head;struct ListNode* meet = NULL;struct ListNode* cur = head;//先判断是否有环while(fast&&fast->next){slow=slow->next;fast=fast->next->next;if(slow==fast){//找到相遇结点meet = slow;break;}}if(meet==NULL){return NULL;}//struct ListNode* newhead = meet->next;meet->next = NULL;struct ListNode* curnew = newhead;//开始相交链表int len1 = 0;int len2 = 0;while(curnew){curnew=curnew->next;len1++;}while(cur){cur=cur->next;len2++;}int gap=abs(len1-len2);struct ListNode* longlist = newhead;struct ListNode* shortlist = head;if(len1<len2){longlist = head;shortlist=newhead;}while(gap--){longlist=longlist->next;}while(1){if(longlist==shortlist){return longlist;}longlist=longlist->next;shortlist=shortlist->next;}}
六、复制带随机值指针的链表
138. 复制带随机指针的链表 - 力扣(LeetCode)
题目描述:
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。
构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。
例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。
返回复制链表的头节点。
用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:
val:一个表示Node.val的整数。random_index:随机指针指向的节点索引(范围从0到n-1);如果不指向任何节点,则为null。
你的代码 只 接受原链表的头节点 head 作为传入参数。

思路:
本题要求拷贝一串链表,并且结点中含有随机值指向,并且要求拷贝的链表与原链表一样,随机域也要指向一样。
- 首先,我们将拷贝的结点一个一个插在原结点后面
- 这时拷贝结点的随机指针域就是原结点指向的随机指针域的next.
- 再取拷贝结点组成新的链表

代码:
struct Node* copyRandomList(struct Node* head)
{struct Node* copy = NULL;struct Node* next = NULL;struct Node* cur = head;while(cur){//copy结点放在原结点后面next = cur->next;copy = (struct Node*)malloc(sizeof(struct Node));copy->val = cur->val;cur->next = copy;copy->next = next;cur = copy->next;}//拷贝随机指针cur = head;while(cur){copy = cur->next;if(cur->random == NULL){copy->random = NULL;}else{ //关键copy->random = cur->random->next;}cur = copy->next;}struct Node* copyhead = NULL;struct Node* copytail = NULL;cur = head;while(cur){//将copy组装成一个新链表(尾插)copy = cur->next;if(copyhead == NULL){copyhead = copytail = copy;}else{//尾插copytail->next = copy;copytail = copytail->next;}//恢复原链表cur->next = copy->next;cur = cur->next;}return copyhead;
}
相关文章:
C语言单链表OJ题(较难)
一、链表分割 牛客网链接 题目描述: 现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。 思路:…...
工业巡检ar沉浸式互动培训体验实现更加直观、生动的流程展示
以往的工业手工巡检效率极低,错误率偏高,漏检问题严重,会因为现场人员对机械设备的早期维护、操作不会,而影响正常交付和服务,智慧工业是工业智能化和信息化的重要体现,在巡检方面自然也要同步提升…...
【Spring】核心容器——依赖自动装配
Spring容器根据bean所依赖的资源在容器中自动查找并注入bean的过程叫做自动装配自动装配的方式 1、按类型 2、按名称(耦合性较高) 3、按构造方法 自动装配特点 1、自动装配用于对引用类型进行依赖注入,不能对简单类型进行操作 2、自动装配的…...
TestNG和Junit5测试框架梳理
一、testNG 1. testNG优势 注解驱动: TestNG 使用注解来标识测试方法、测试类和配置方法,使得测试更具可读性。 并行执行: TestNG 支持多线程并行执行测试,可以加速测试套件的执行。 丰富的配置: 可以通过 XML 配置文…...
算法练习Day46|139.单词拆分
LeetCode:139.单词拆分 139. 单词拆分 - 力扣(LeetCode) 1.思路 字符串是否能被字符串列表中的元素拼接出来,显然是一个背包问题,而且需要排列。 将字典转换为HashSet,利用.contains()方法判断是否存在元素与背包中的子串相同…...
Maven工程的安装配置及搭建(集成eclipse完成案例,保姆级教学)
目录 一.下载及安装及环境配置 1.下载及安装 2.环境变量的配置 3.检测是否安装成功 4.配置Maven 1.更换本地仓库 2. 配置镜像 二.集成eclipse完成案例 1.eclipse前期配置Maven 2.创建Maven工程 一.下载及安装及环境配置 1.下载及安装 下载地址:Maven – Down…...
82 | Python可视化篇 —— Plotly数据可视化
文章目录 什么是 Plotly安装 Plotly创建散点图创建线图创建条形图创建饼图创建热力图3D图(3D Plot)直方图(Histogram)3D表面图(3D Surface Plot)箱线图(Box Plot)散点地图(Scatter Map)量级地图(Choropleth Map)在网页中嵌入 Plotly 图表总结什么是 Plotly Plotly…...
Golang 包详解以及go mod
Golang 中包的介绍和定义 包(package)是多个 Go 源码的集合,是一种高级的代码复用方案,Go 语言为我们提供了 很多内置包,如 fmt、strconv、strings、sort、errors、time、encoding/json、os、io 等。 Golang 中的包可以分为三种:1、系统内置包 2、自定义包 3、第三方包…...
中级课程-SSRF(CSRF进阶)
文章目录 成因危害挖掘 成因 危害 挖掘...
C++命名空间
目录 格式 使用 命名空间的嵌套 使用 using声明 命名空间里面包含了逻辑结构上相互关联的一组类、函数、模板等。命名空间像是一个容器,把某些在逻辑结构上相关的 “ 对象 ” 放在一起并与外界区分。特别的,命名空间里的变量名或类名可以和命名空间外…...
阿里云服务器搭建Magento电子商务网站图文教程
本文阿里云百科分享使用阿里云服务器手动搭建Magento电子商务网站全流程,Magento是一款开源电商网站框架,其丰富的模块化架构体系及拓展功能可为大中型站点提供解决方案。Magento使用PHP开发,支持版本范围从PHP 5.6到PHP 7.1,并使…...
Docker安装 Kibana
目录 前言安装Kibana步骤1:准备1. 安装docker2. 搜索可以使用的镜像。3. 也可从docker hub上搜索镜像。4. 选择合适的redis镜像。 步骤2:拉取 kibana 镜像拉取镜像查看已拉取的镜像 步骤3:创建容器创建容器方式1:快速创建容器 步骤…...
数字图像处理 --- 相机的内参与外参(CV学习笔记)
Pinhole Camera Model(针孔相机模型) 针孔相机是一种没有镜头、只有一个小光圈的简单相机。 光线穿过光圈并在相机的另一侧呈现倒立的图像。为了建模方便,我们可以把物理成像平面(image plane)上的图像移到实际场景(3D object)和焦点(focal p…...
基于新浪微博海量用户行为数据、博文数据数据分析:包括综合指数、移动指数、PC指数三个指数
基于新浪微博海量用户行为数据、博文数据数据分析:包括综合指数、移动指数、PC指数三个指数 项目介绍 微指数是基于海量用户行为数据、博文数据,采用科学计算方法统计得出的反映不同事件领域发展状况的指数产品。微指数对于收录的关键词,在指…...
金融反欺诈的应用实践
“根据980起全球重大金融欺诈事件分析,60%的欺诈发生在移动端,同比增长170%。“,在香港近日举办的金融科技沙龙上,顶象金融业务安全专家史博表示,金融业已成为不法分子重要的攻击对象。 本届金融科技沙龙由Databricks…...
Win10启动Jmeter报错提示jmeter.log拒绝访问问题
jmeter版本:5.4.1 查看版本 在dos命令窗口中进入jmeter安装目录下的bin目录中:执行jmeter - v命令 我启动的方式是:进入jmeter安装目录下的bin目录中双击jmeter.bat启动的。结果报错,但是不影响使用。 报错日志如下: …...
Vue中使用Tailwind css
1.什么是Tailwind 就是一个CSS框架,和你知道的bootstrap,element ui,Antd,bulma。一样。将一些css样式封装好,用来加速我们开发的一个工具。 Tailwind解释 tailwind css 中文文档 2.Vue使用Tailwind配置 1. 新建vu…...
承接各种设计
小弟985研究生毕业,目前攻读读博士,可做各种设计,包括但不限于Matlab 电力电子/电气工程,matlab/simulink 电气专业仿真MATLAB 电气工程专业,matlab建模 电力电子,电气工程,电力系统,…...
HTTP请求性能分析 - 简单
使用随手可得的工具,尽量少的前置要求,来完成任务。 0. 目录 1. 前言2. 分析工具2.1 基于Chrome DevTools 的Timing2.1.1 关于Network标签页下的Timing部分2.1.2 一些注意项 2.2 基于Curl 命令 3. 剩下的工作 1. 前言 对于业务开发选手而言,…...
腾讯云标准型CVM云服务器详细介绍
腾讯云CVM服务器标准型实例的各项性能参数平衡,标准型云服务器适用于大多数常规业务,例如:web网站及中间件等,常见的标准型云服务器有CVM标准型S5、S6、SA3、SR1、S5se等规格,腾讯云服务器网来详细说下云服务器CVM标准…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
