链表 oj2 (7.31)
206. 反转链表 - 力扣(LeetCode)

我们通过头插来实现


将链表上的节点取下来(取的时候需要记录下一个节点),形成新的链表,对新的链表进行头插。
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* reverseList(struct ListNode* head)
{//用cur对原链表进行遍历struct ListNode* cur=head,*newhead=NULL;//原链表为空,遍历结束while(cur){//记录cur的下一个节点struct ListNode* next=cur->next;//cur链接到新链表cur->next=newhead;//cur成为新链表的头指针newhead=cur;//cur通过next在原链表中向后移cur=next;}return newhead;
}
21. 合并两个有序链表 - 力扣(LeetCode)

这里需要引用哨兵位,先介绍一下


哨兵位就是不带数据的头节点,且为固定的节点,当链表为空时,带哨兵位的链表(右)存在一个头节点(空间),而不带哨兵位的链表(左)则没有节点。
更改带哨兵位的链表(增删查改)就不需要判断,通过二重指针改变头指针,通过 next 就能直接实现。
使用的时候为哨兵位申请一块动态内存,作为头节点,结束的时候可以根据题目要求将其释放。
实现:
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){if(list1==NULL){return list2;}if(list2==NULL){return list1;}struct ListNode* head=NULL,*tail=NULL;//带一个哨兵位,方便尾插head=tail=(struct ListNode*)malloc(sizeof(struct ListNode));while(list1&&list2){if(list1->val<list2->val){tail->next=list1;tail=tail->next;list1=list1->next;}else{tail->next=list2;tail=tail->next;list2=list2->next;}}//if(list2){tail->next=list2;}if(list1){tail->next=list1;}//哨兵位的头使用完需要释放掉struct ListNode* del=head;head=head->next;free(del);return head;
}
链表分割_牛客题霸_牛客网 (nowcoder.com)

思路是创建两个链表,将小于 x 的尾插到第一个链表,大于 x 尾插到第二个链表。
此题目用带哨兵位的链表做更加简单,因为尾插时不用考虑链表是否为空的情况,将两个链表链接的时候也不需要考虑其中一个链表为空的情况了(即不用担心链表为空的情况)。
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
#include <cstddef>
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));//用cur遍历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;}//将低链表的尾链接到高链表的哨兵位之后的节点ltail->next = ghead->next;//将目标链表的尾置空,否则产生环gtail->next = nullptr;//拷贝目标链表的头节点struct ListNode* head = lhead->next;//释放哨兵位free(lhead);free(ghead);return head;}
};
链表的回文结构_牛客题霸_牛客网 (nowcoder.com)

回文结构就是对称的意思,例如 1 2 2 1,1 2 3 2 1。
结合前面的 oj 题目,我们容易想到一个方法,先找出链表的后半段,然后将其逆置,再将其与前半段比较,如果都相同,则为回文结构。
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public://反转链表struct ListNode* reverseList(struct ListNode* head)
{//用cur对原链表进行遍历struct ListNode* cur=head,*newhead=nullptr;//原链表为空,遍历结束while(cur){//记录cur的下一个节点struct ListNode* next=cur->next;//cur链接到新链表cur->next=newhead;//cur成为新链表的头指针newhead=cur;//cur通过next在原链表中向后移cur=next;}return newhead;
}//找出中间节点struct ListNode* middleNode(struct ListNode* head){struct ListNode* slow=head,*fast=head;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;}return slow;
}bool chkPalindrome(ListNode* head) {//找出后半段struct ListNode* mid=middleNode(head);//将后半段逆置struct ListNode* rmid=reverseList(mid);while(rmid&&head){if(rmid->val!=head->val){return false;}rmid=rmid->next;head=head->next;}return true;}
};
160. 相交链表 - 力扣(LeetCode)

思路:
1.遍历计算出A,B链表各自的长度 lenA,lenB
2.长的链表走差距步 lenA-lenB,此时两条链表的长度相同
3.同时移动找交点(指针相同),最后返回这个交点。
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode* curA=headA,*curB=headB;int lenA=1,lenB=1;//提示了链表不为空,因此结尾用下一个节点判断,同时初始长度为1while(curA->next){curA=curA->next;lenA++;}while(curB->next){curB=curB->next;lenB++;}//尾节点不同,一定没有交点if(curA !=curB){return NULL;}struct ListNode* longList=headA,*shortList=headB;if(lenA<lenB){longList=headB;shortList=headA;}//算出差距步(绝对值)int gap=abs(lenA-lenB);//长的先走差距步while(gap--){longList=longList->next;}//同时走找交点,相等就找到了while(longList !=shortList){longList=longList->next;shortList=shortList->next;}return longList;
}
141. 环形链表 - 力扣(LeetCode)

链表有循环或者非循环

循环链表的尾节点指向头节点。
还有一种带环链表,它的尾节点可以指向链表的任意一个节点(包括自己)。
带环链表中的节点会重复出现,我们依然定义一快一慢指针,如果是带环链表,那么快指针一定能追上慢指针,两个指针一定有相等的时候(追及问题);如果不带环,直接就遍历到空了。
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/
bool hasCycle(struct ListNode *head) {struct ListNode* fast=head,*slow=head;//链表可能不为环形while(fast&&fast->next){fast=fast->next->next;slow=slow->next;if(slow==fast){return true;}}return false;
}
由带环追及问题引发的思考:
1.slow走一步,fast走两步,一定能追上吗,会不会错过?
2.slow走一步,fast走n步(n>=3),一定能追上吗,会不会错过?


如果 slow 走一步,fast 走三步,假设 slow 入环时,slow 和 fast 的距离为 M,每移动(追击)一次,距离缩小2,若 M 为偶数,则当距离减为0时,刚好追上;若 M 为奇数,距离最小时为 -1,即fast 超过了 slow 一步,此时又要观察环的长度C,此时 slow 和 fast 的距离为 C-1,若 C 为奇数,C-1为偶数,那么再经过一轮追击之后就能刚好追上。如果 C 为偶数,那么 C-1 为奇数,奇数-2 永远为奇数,就永远追不上了。

142. 环形链表 II - 力扣(LeetCode)


分析:
设七点到入口长度:L
环的周长:C
入口点到相遇点的距离:X
fast 走的距离(速度)为 slow 的二倍
slow 进环后的一圈内,fast 一定追上 slow,slow 走的距离为 L+X
slow 进环时,fast 已经走了 n(n>=1) 圈了,fast 走的距离为 L+n*C+X
fast 追赶 slow 之前会先补足 n 圈,
fast 走的距离(速度)为 slow 的二倍可知
2(L+X)=L+n*C+X
同减去L+X
L+X=n*C
L=n*C-X
计算的时候我们默认为 fast 已经跑到 n-1 圈,因此不需要关注 n .
从这个结论我们可以得到从相遇点到环入口点的距离与从起点到入口点的距离相同,要想找到入口点,就需要两个指针分别从这两个点开始跑,它们相遇的位置就是入口点。
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/
struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* fast,*slow;fast=slow=head;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;//相遇if(slow==fast){//记录相遇点struct ListNode* meet=slow;//各自从相遇点和头节点开始跑,相遇则为入口点while(head!=meet){head=head->next;meet=meet->next;}return meet;}}//fast或fast的下一个节点为空,说明无环return NULL;
}
法2:

将环从相遇点断开,相遇点之后作为一条新的链表,和旧链表一起找相交点,相交点就是入口点。
相关文章:
链表 oj2 (7.31)
206. 反转链表 - 力扣(LeetCode) 我们通过头插来实现 将链表上的节点取下来(取的时候需要记录下一个节点),形成新的链表,对新的链表进行头插。 /*** Definition for singly-linked list.* struct ListNode…...
python案例:六大主流小说平台小说下载
嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 很多小伙伴学习Python的初衷就是为了爬取小说,方便又快捷~ 辣么今天咱们来分享6个主流小说平台的爬取教程~ 一、流程步骤 流程基本都差不多&#x…...
前端已死!转行网络安全,挖漏洞真香!
最近,一个做运维的朋友在学渗透测试。他说,他公司请别人做渗透测试的费用是 2w/人天,一共2周。2周 10w 的收入,好香~ 于是,我也对渗透测试产生了兴趣。开始了探索之路~ 什么是渗透测试 渗透测试这名字听起来有一种敬畏…...
【AI】了解人工智能、机器学习、神经网络、深度学习
深度学习、神经网络的原理是什么? 深度学习和神经网络都是基于对人脑神经系统的模拟。下面将分别解释深度学习和神经网络的原理。深度学习的原理:深度学习是一种特殊的机器学习,其模型结构更为复杂,通常包括很多隐藏层。它依赖于神…...
【Axure高保真原型】3D柱状图_中继器版
今天和大家分享3D柱状图_中继器版的原型模板,图表在中继器表格里填写具体的数据,调整坐标系后,就可以根据表格数据自动生成对应高度的柱状图,鼠标移入时,可以查看对应圆柱体的数据……具体效果可以打开下方原型地址体验…...
【word技巧】word页眉,如何禁止他人修改?
我们设置了页眉内容之后,不想其他人修改自己的页眉内容,我们可以设置加密的,设置方法如下: 先将页眉设置好,退出页眉设置之后,我们选择布局功能,点击分隔符 – 连续 设置完之后页面分为上下两节…...
Python 机器学习入门之逻辑回归
系列文章目录 第一章 Python 机器学习入门之线性回归 第一章 Python 机器学习入门之梯度下降法 第一章 Python 机器学习入门之牛顿法 第二章 Python 机器学习入门之逻辑回归 逻辑回归 系列文章目录前言一、逻辑回归简介二、逻辑回归推导1、问题2、Sigmoid函数3、目标函数3.1 让…...
现货白银赚钱有风险吗?
跟现货黄金一样,现货白银市场是一个公平公正的市场,即使是中小投资者,也能拥有平等的获利机会,同样可以借助平台所给予的资金杠杆,实现个人财富的快速增值。 很多人都是冲着现货白银的财富效应而进入这个市场ÿ…...
Debian衍生桌面项目SpiralLinux12.231001发布
SpiralLinux 是一个从 Debian 衍生出来的桌面项目,其重点是在所有主要桌面环境中实现简洁性和开箱即用的可用性。 spiral Linux 是为刚接触 Linux 世界的人们量身定制的发行版。这是 GeckoLinux 开发人员的创意,他更喜欢保持匿名。尽管他不愿透露姓名&a…...
元宇宙在技术大爆炸时代迎来链游新世界
元宇宙是一个完全虚拟的世界,人们可以在其中互动,就像在现实世界中一样。 随着元宇宙概念不断的被深化,目前许多用户群体已经注意到并加入元宇宙领域。而元宇宙比较火的场景有社交、游戏、虚拟会议等,在许多方面,游戏一…...
9中间件-Redis、MQ---进阶
mq进阶 RabbitMQ 怎么避免消息丢失? 把消息持久化磁盘,保证服务器重启消息不丢失。 每个集群中至少有一个物理磁盘,保证消息落入磁盘。#RabbitMQ 的消息是怎么发送的? 首先客户端必须连接到 RabbitMQ 服务器才能发布和消费消息&…...
JVM(Java Virtual Machine)内存模型篇
前言 本文是JVM系列的内存模型篇,参考资料为《深入理解Java虚拟机》,本文章将会以HotSpot 虚拟机为介绍基础。 1.JVM简单介绍 Java Virtual Machine是运行Java程序的基础,JVM基于C、C实现,JVM有很多种类,但是这些虚…...
对地址解析协议ARP进一步探讨
之前在讨论MAC地址和IP地址时,顺便对ARP协议做了初步的总结 (计网第三章(数据链路层)(四)(MAC地址和IP地址、ARP协议、集线器和交换机)),但是当时对ARP请求的…...
java:java.util.StringTokenizer实现字符串切割
java:java.util.StringTokenizer实现字符串切割 1 前言 java.util工具包提供了字符串切割的工具类StringTokenizer,Spring等常见框架的字符串工具类(如Spring的StringUtils),常见此类使用。 例如Spring的StringUtil…...
IPV6 ND协议--源码解析【根源分析】
ND协议介绍 ND介绍请阅读上一篇文章:IPv6知识 - ND协议【一文通透】11.NDP协议分析与实践_router solicitation报文中不携带source link-layer address-CSDN博客 ND协议定义了5种ICMPv6报文类型,如下表所示: NS/NA报文主要用于地址解析RS/…...
Python学习笔记——存储容器
食用说明:本笔记适用于有一定编程基础的伙伴们。希望有助于各位! 列表 列表类似数组,其中可以包含不同类型的元素,写法如下: list1 [Google, Runoob, 1997, 2000] list2 [1, 2, 3, 4, 5 ] list3 ["a", …...
Android DI框架-Hilt
到底该如何理解<依赖注入> 模版代码:食之无味,弃之可惜 public class MainActivity extends Activity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);TextView mTextView(TextView) findVi…...
基于寄生捕食优化的BP神经网络(分类应用) - 附代码
基于寄生捕食优化的BP神经网络(分类应用) - 附代码 文章目录 基于寄生捕食优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.寄生捕食优化BP神经网络3.1 BP神经网络参数设置3.2 寄生捕食算法应用 4.测试结果…...
【Java常见的几种设计模式】
Java常见的几种设计模式 1. 单例模式(Singleton Pattern)2. 工厂模式(Factory pattern)3. 抽象工厂模式(Abstract Factory Pattern)4. 建造者模式(Builder Pattern)5. 原型模式&…...
jupyter崩溃进不去,报错module ‘mistune‘ has no attribute ‘BlockGrammar‘
是python包引起的问题 [E 2023-10-14 08:40:25.414 ServerApp] Uncaught exception GET /api/nbconvert?1697244025327 (127.0.0.1) HTTPServerRequest(protocol‘http’, host‘localhost:8090’, method‘GET’, uri‘/api/nbconvert?1697244025327’, version‘HTTP/1.1’…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
Canal环境搭建并实现和ES数据同步
作者:田超凡 日期:2025年6月7日 Canal安装,启动端口11111、8082: 安装canal-deployer服务端: https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...
前端工具库lodash与lodash-es区别详解
lodash 和 lodash-es 是同一工具库的两个不同版本,核心功能完全一致,主要区别在于模块化格式和优化方式,适合不同的开发环境。以下是详细对比: 1. 模块化格式 lodash 使用 CommonJS 模块格式(require/module.exports&a…...
Cursor AI 账号纯净度维护与高效注册指南
Cursor AI 账号纯净度维护与高效注册指南:解决限制问题的实战方案 风车无限免费邮箱系统网页端使用说明|快速获取邮箱|cursor|windsurf|augment 问题背景 在成功解决 Cursor 环境配置问题后,许多开发者仍面临账号纯净度不足导致的限制问题。无论使用 16…...
中科院1区顶刊|IF14+:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点
中科院1区顶刊|IF14:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点 当下,免疫与代谢性疾病的关联研究已成为生命科学领域的前沿热点。随着研究的深入,我们愈发清晰地认识到免疫系统与代谢系统之间存在着极为复…...
视觉slam--框架
视觉里程计的框架 传感器 VO--front end VO的缺点 后端--back end 后端对什么数据进行优化 利用什么数据进行优化的 后端是怎么进行优化的 回环检测 建图 建图是指构建地图的过程。 构建的地图是点云地图还是什么信息的地图? 建图并没有一个固定的形式和算法…...
数据可视化交互
目录 【实验目的】 【实验原理】 【实验环境】 【实验步骤】 一、安装 pyecharts 二、下载数据 三、实验任务 实验 1:AQI 横向对比条形图 代码说明: 运行结果: 实验 2:AQI 等级分布饼图 实验 3:多城市 AQI…...
