【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…...
OpenClaw+Qwen3-14b_int4_awq:3种降低token消耗的实战技巧
OpenClawQwen3-14b_int4_awq:3种降低token消耗的实战技巧 1. 为什么我们需要关注token消耗 第一次看到OpenClaw的token账单时,我差点从椅子上跳起来。一个简单的文件整理任务竟然消耗了接近5000个token,这还只是测试环境下的单次运行。当我…...
Youtu-VL-4B-Instruct效果展示:高清OCR+精准Box定位+多轮图文对话作品集
Youtu-VL-4B-Instruct效果展示:高清OCR精准Box定位多轮图文对话作品集 1. 引言:当“看图说话”进化成“看图办事” 你有没有遇到过这种情况?看到一张复杂的图表,想快速提取里面的数据,却要手动一个个去数;…...
深入解析ReID核心评价指标:从Rank1到mINP的实战应用
1. ReID评价指标入门:为什么我们需要这么多指标? 第一次接触ReID(行人重识别)的朋友可能会被各种评价指标搞得头晕——Rank1、mAP、ROC、mINP...这些字母组合到底在说什么?其实这些指标就像医生给病人做体检时的不同检…...
OpenClaw压力测试:Phi-3-mini-128k-instruct持续运行24小时稳定性报告
OpenClaw压力测试:Phi-3-mini-128k-instruct持续运行24小时稳定性报告 1. 测试背景与目标 上周在本地部署了OpenClawPhi-3-mini组合后,我一直在思考这套方案的稳定性边界。作为个人自动化助手,它能否胜任724小时不间断工作?当我…...
嵌入式系统调试实战:工具、技巧与内存管理
1. 嵌入式调试的核心价值与挑战从事嵌入式开发十多年来,我深刻体会到调试环节往往决定着项目的成败。与桌面软件开发不同,嵌入式系统一旦部署后很难进行现场维护,这就要求我们必须在上线前解决所有潜在问题。根据行业统计,嵌入式工…...
【应答器】基于matlab应答器特殊区段信息包报文编码仿真【含Matlab源码 15258期】
💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞Ὁ…...
论文AIGC全红99%怎么救?2026实测Gemini去痕术:3组指令集联合3大工具,稳稳拉回10%安全线
视角重构,打破“平铺直叙”的机械感 AI生成的最大特征是“正确但平庸的上帝视角”。要ai降ai,第一步不是改词,而是强行植入一个具有批判性的“人类观察者”视角,迫使模型重组叙事逻辑。 核心原理:通过引入“辩证法”…...
实战指南:基于快马平台生成git自动化部署脚本,实现ci/cd流水线
今天想和大家分享一个实战中特别实用的技巧:如何用git结合自动化脚本来简化版本发布和部署流程。这个方案在我们团队的实际项目中已经稳定运行了大半年,效果非常不错。 版本号自动打tag功能 这个脚本的核心功能之一就是自动读取项目中的版本号文件&…...
微信QQ防撤回神器:RevokeMsgPatcher 2.1 终极使用教程
微信QQ防撤回神器:RevokeMsgPatcher 2.1 终极使用教程 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitcode.co…...
MySQL
我目前正在学习SQL语句,我所了解到的MySQL其实是一堆服务器,在下载服务器的时候,可以选择下载一些客户端,MySQL会自带一些客户端,像类似于终端的小黑框,还有什么bench;我还是喜欢外观好看的客户端 !我学SQL语句目前学到了数据类型,有数值型的,字符型的,二进制型的,值得一提的是…...
