【LeetCode】【数据结构】单链表OJ常见题型(一)

👀樊梓慕:个人主页
🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》
🌝每一个不曾起舞的日子,都是对生命的辜负。
目录
前言:
【LeetCode】203.移除链表元素
【LeetCode】206.反转链表
思路一
思路二
【LeetCode】876.链表的中间结点
快慢指针法
【LeetCode】剑指Offer 22.链表中倒数第k个结点
快慢指针法
【LeetCode】21.合并两个有序链表
【LeetCode】剑指Offer Ⅱ 27.回文链表
前言:
本系列博文博主会讲解链表的经典OJ题目。
欢迎大家📂收藏📂以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。
=========================================================================
GITEE相关代码:🌟fanfei_c的仓库🌟
=========================================================================
【LeetCode】203.移除链表元素
原题链接:🍏移除链表元素🍏
题目:给你一个链表的头节点
head和一个整数val,请你删除链表中所有满足Node.val == val的节点,并返回 新的头节点 。
要想删除当前元素,需要知道当前元素的位置,及前一个元素的位置,并且保存下一个元素的位置。
所以我们需要三个指针:
- 一个指针命名为cur,作用是遍历;
- 一个指针命名为prev,指向位置为cur的前一个位置,作用是删除(prev->next=cur->next);
- 一个next指针用来保存cur的后一个位置,确保free掉cur后仍然可以找到下一元素。
代码实现:
/*
解题思路:从头节点开始进行元素删除,每删除一个元素,需要重新链接节点
*/
struct ListNode* removeElements(struct ListNode* head, int val) {if(head == NULL)return NULL;struct ListNode* cur = head;struct ListNode* prev = NULL;while(cur){//如果当前节点是需要删除的节点if(cur->val == val){//首先保存下一个节点struct ListNode* next = cur->next;//如果删除的为头节点,更新头节点//否则让当前节点的前趋节点链接next节点if(prev == NULL){head = cur->next;}else{prev->next = cur->next; }//释放当前节点,让cur指向nextfree(cur);cur = next;}else{//如果cur不是需要删除的节点,则更新prev,curprev = cur;cur = cur->next;}}return head;
}
注意:考虑极端情况,如首个位置就是val的情况,作单独处理。
【LeetCode】206.反转链表
原题链接:🍏反转链表🍏
题目:给你单链表的头节点
head,请你反转链表,并返回反转后的链表。
思路一
同样的我们需要三个指针来完成这一操作:
- 一个指针命名为cur,作用是遍历;
- 一个指针命名为prev,作用是拿到cur的前一个地址,而后改变cur->next指向prev;
- 一个指针命名为next,作用是保存cur的后一个位置,防止修改cur->next后找不到cur的后一个位置。
代码实现:
struct ListNode* reverseList(struct ListNode* head)
{struct ListNode* prev = NULL;struct ListNode* cur = head, * next = head;if (cur)// 检查cur是否为空{next = cur->next;}while (cur){// 往后走prev = cur;cur = next;if(next)// 检查next是否为空next = next->next;}return prev;
}
思路二
取结点头插,完成逆置。
大家只要掌握了头插就很简单了。
代码实现:
// 取节点头插的思想完成逆置
struct ListNode* reverseList(struct ListNode* head) {struct ListNode* newhead = NULL;struct ListNode* cur = head;while(cur){struct ListNode* next = cur->next;//头插新节点,更新头cur->next = newhead;newhead = cur;cur = next;}return newhead;
}
【LeetCode】876.链表的中间结点
原题链接:🍏链表的中间结点🍏
题目:给你单链表的头结点
head,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
快慢指针法
若想找到中间结点,我们可以定义两个指针:
- 一个命名为slow,令slow每次走一步;
- 一个命名为fast,令fast每次走两步。
这样当fast为NULL,或fast->next为NULL时,slow恰好处于中间位置,最后返回slow即可。
代码实现:
struct ListNode* middleNode(struct ListNode* head)
{struct ListNode* slow=head;struct ListNode* fast=head;while(fast && fast->next)// 分别为奇数个与偶数个的判断条件{slow=slow->next;fast=fast->next->next;}return slow;
}
【LeetCode】剑指Offer 22.链表中倒数第k个结点
原题链接:🍏链表中倒数第k个结点🍏
题目:输入一个链表,输出该链表中倒数第k个节点。
快慢指针法
同样需要快慢指针的方法。
令fast先走k步,slow不动,然后slow与fast同时向后走,直到fast为NULL,此时slow的位置就是倒数第k个位置。
代码实现:
struct ListNode* getKthFromEnd(struct ListNode* head, int k)
{struct ListNode* slow=head,* fast=head;while(k--){if(fast==NULL){return NULL;} fast=fast->next;}while(fast){slow=slow->next;fast=fast->next;}return slow;
}
【LeetCode】21.合并两个有序链表
原题链接:🍏合并两个有序链表🍏
题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

思路:取小的尾插。
注意:极端情况的判断,如其中一个链表为空等等。
代码实现:
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;while(list1 && list2){if(list1->val<list2->val){if(head==NULL)// 头结点直接赋值{head=tail=list1;}else// 尾插{tail->next=list1;tail=tail->next;}list1=list1->next;}else{if(head==NULL)// 头结点直接赋值{head=tail=list2;}else// 尾插{tail->next=list2;tail=tail->next;}list2=list2->next;}}if(list1)// list1有剩余{tail->next=list1;}if(list2)// list2有剩余{tail->next=list2;}return head;
}
【LeetCode】剑指Offer Ⅱ 27.回文链表
原题链接:🍏回文链表🍏
题目:给定一个链表的 头节点
head,请判断其是否为回文链表。如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。

思路:找到中间结点,将后半部分逆置,最后令前后两部分一一对比,如果结点的值全部相同,则为回文。

刚好我们可以利用上面实现过的函数:链表的中间结点和反转链表。
代码实现:
// 找到中间结点
struct ListNode* middleNode(struct ListNode* head)
{struct ListNode* slow = head;struct ListNode* fast = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;
}// 反转一个单链表
struct ListNode* reverseList(struct ListNode* head)
{struct ListNode* tail = NULL;struct ListNode* cur = head, * next = head;while (next){next = cur->next;cur->next = tail;tail = cur;cur = next;}return tail;
}// 判断回文结构
bool isPalindrome(struct ListNode* head)
{struct ListNode* mid=middleNode(head);struct ListNode* newhead=reverseList(mid);while(head && newhead){if(head->val!=newhead->val){return false;}else{head=head->next;newhead=newhead->next;}}return true;
}
=========================================================================
如果你对该系列文章有兴趣的话,欢迎持续关注博主动态,博主会持续输出优质内容
🍎博主很需要大家的支持,你的支持是我创作的不竭动力🍎
🌟~ 点赞收藏+关注 ~🌟
=========================================================================
相关文章:
【LeetCode】【数据结构】单链表OJ常见题型(一)
👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》 🌝每一个不曾起舞的日子,都是对生命的辜负。 目录 前言: 【LeetCode】203.移除链表元素 【LeetCo…...
QGraphicsView实现简易地图3『局部加载-地图缩放』
前文链接:QGraphicsView实现简易地图2『瓦片经纬度』 第一篇文章提到过,当地图层级较大时,暴力全加载地图会造成程序卡顿,因此需要实现地图的局部加载。 实现思路:以地图窗口(以下称为视口)为地…...
bash的特性(二)IO重定向与管道
bash的I/O重定向及管道 一、概述 在shell中,最常使用的fd(file descriptor)有三个,标准输入,标准输出,错误输出。进程用文件描述符来管理打开的文件。 名称 文件描述符 标准输入(stdin) 0 键盘,也可以…...
elb 直接配置到后端服务器组
出现上图报错的原因是,前面elb配置了https证书,后端的nginx也配置了证书,导致冲突。 需要修改后端的nginx配置文件,将证书配置注释掉。 如果出现健康检查异常,需要在对应服务器的安全组上配置elb所在的网段的访问权限…...
安卓:BottomNavigationBar——底部导航栏控件
目录 一、BottomNavigationBar介绍 二、BottomNavigationBar的常用方法及其常用类 (一)、常用方法 1. 添加菜单项 2. 移除菜单项 3. 设置选中监听器 4. 设置当前选中项 5. 设置徽章 6. 样式和颜色定制 7. 动画效果 8. 隐藏底部导航栏。 9、设…...
十、用 ChatGPT 辅助写文章
目录 一、实验介绍 二、背景 三、ChatGPT 写作方式 3.1 传统写作方式 3.2 ChatGPT 写作方式...
计算机毕设 深度学习猫狗分类 - python opencv cnn
文章目录 0 前言1 课题背景2 使用CNN进行猫狗分类3 数据集处理4 神经网络的编写5 Tensorflow计算图的构建6 模型的训练和测试7 预测效果8 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往…...
60多行代码仿制B站首页一个好看的卡片效果
文章目录 1、为啥是这个?2、仿制效果3、实现思路4、代码5、查看B站如何实现 1、为啥是这个? 看到Bilibili首页的一个卡片,看着效果很不错,给人很舒适的感觉。一琢磨貌似也不难,甚至只需要一层 div 就可以实现主要框架…...
Redis内网主从节点搭建
Redis内网主从节点搭建 1、文件上传2、服务安装3、服务启动4、配置主从复制 1、文件上传 内网环境手动上传gcc-c、redis.tar文件 2、服务安装 # 解压 unzip gcc-c.zip unzip gcc_rpm.zip tar -zxvf redis-6.2.13.tar.gz# 安装 cd gcc_rpm/ rpm -ivh *.rpm --nodeps --force…...
ESP32-C2开发板 ESP8684芯片 兼容ESP32-C3开发
C2是一个芯片采用4毫米x 4毫米封装,与272 kB内存。它运行框架,例如ESP-Jumpstart和ESP造雨者,同时它也运行ESP-IDF。ESP-IDF是Espressif面向嵌入式物联网设备的开源实时操作系统,受到了全球用户的信赖。它由支持Espressif以及所有…...
Zebec 创始人 Sam 对话社区,“Zebec 生态发展”主题 AMA 回顾总结
近日,Zebec Protocol 创始人 Sam 作为嘉宾,与社区进行了以“Zebec 生态发展”为主题的 AMA 对话。Sam 在线上访谈上对 Zebec 路线图、Zebec 质押、NautChain通证进行了解读,并对 Zebec 的进展、生态建设的愿景进行了展望。本文将对本次 AMA 进…...
一台电脑给另外一台电脑共享网络
这里写自定义目录标题 有网的电脑上操作一根网线连接两台电脑没网的电脑上 有网的电脑上操作 右键->属性->共享 如同选择以太网,勾选。确认。 一根网线连接两台电脑 没网的电脑上 没网的电脑为mips&麒麟V10 新增个网络配置ww,设置如下。 …...
AAA 认证
概念 AAA是认证(Authentication)、授权(Authorization)和计费(Accounting)的简称,是网络安全中进行访问控制的一种安全管理机制,提供认证、授权和计费三种安全服务。 AAA 常见架构...
jvm-程序计数器
1、是什么 4 学习路线 类加载器 内存结构方法区 类堆 对象虚拟机栈程序计数器本地方法栈 执行引擎解释器编译器 热点代码 5 程序计数器–作用 java源代码编译蛏二进制字节码 jvm指令。 对所有平台保持一致性。记住下一条jvm指令的执行地址。寄存器,cpu中读取速度…...
NestJs Debug配置文件
(事缓则圆,人缓则安,语迟则贵,虎行似病,鹰立似睡。清俞万春《荡寇志》) {"version": "0.2.0","configurations": [{"type": "node","request": "launch","name": &quo…...
题解 | #C.idol!!# 2023牛客暑期多校6
C.idol!! 数学 题目大意 正整数 n n n 的双阶乘 n ! ! n!! n!! 表示不超过 n n n 且与 n n n 有相同奇偶性的所有正整数乘积 求对于给定 n n n , ∏ i 1 n i ! ! \prod\limits_{i1}^n i!! i1∏ni!! 的后缀 0 0 0 个数 解题思路 根据双阶乘的性质&…...
使用filebeat收集并解析springboot日志
序 本文主要研究一下如何使用filebeat收集并解析springboot日志 安装 在官网的下载页面filebeat/downloads提供了一些特定平台的安装包,不过对应linux最为省事的安装方式就是直接下载x86_64压缩包,然后解压即可 wget https://artifacts.elastic.co/d…...
P1993 小 K 的农场
小 K 的农场 题目描述 小 K 在 MC 里面建立很多很多的农场,总共 n n n 个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共 m m m 个),以下列三种形式描述:…...
Spring boot 集成 Skywalking 配置 || Skywalking 打不开【已解决】
一、Skywalking官网 Apache SkyWalking 1.下载Skywalking APM (如果下载最新的,双击打开闪退,选老点的版本) 2. 下载 Skywalking Agents 如果下载太慢,建议复制下载链接,然后用下载器下载,比…...
手把手教你使用 ftrace 对 Linux 系统进行 debug
1、简介 strace:用来跟踪 Linux 进程执行时的系统调用和接收所接收的信号,可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。 ftrace:是一个 Linux 内核函数跟踪器,function tracer,旨在帮助开发人员和系统设计者可以找到内核内部发生的事情,从 L…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
