当前位置: 首页 > news >正文

数据结构——单链表OJ题

在这里插入图片描述

单链表OJ题

  • 前言
  • 一、删除链表中等于给定值 val 的所有节点
  • 二、反转一个单链表
  • 三、返回链表的中间结点
  • 四、输出该链表中倒数第k个结点
  • 五、将两个有序链表合并
  • 六、链表的回文结构
  • 七、将链表分割成两部分
  • 八、找出第一个公共结点
  • 九、判断链表中是否有环
  • 总结


前言

在前面的博客中我们知道了什么是单链表以及如何建立单链表!
现在让我们来检验一下学习成果吧!

提示:此博客中题目均来自牛客网以及力扣网!在题目中我会附带两大网站的链接,大家也可以去练习一下!
若有链接问题可以在评论区及时反馈!


一、删除链表中等于给定值 val 的所有节点

题目链接:OJ链接
在这里插入图片描述

提示:
列表中的节点数目在范围 [0, 104] 内
1 <= Node.val <= 50
0 <= val <= 50

思路解析:
在这里插入图片描述

代码演示:

struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* newhead = NULL;struct ListNode* move = head;struct ListNode* tail = NULL;while (move != NULL) {if (move->val != val) {if (tail == NULL) {//如果newnode为NULL,则tail等于newnode,则直接将结点地址赋予tailnewhead = tail = move;move = move->next;}else {tail->next = move;move = move->next;tail = tail->next;}}else {struct ListNode* temp = move;//新建结点保存要free的地址,以免free后造成节点丢失move = move->next;free(temp);}}if (tail)//如果新链表不为空,则将其尾结点的next置空tail->next = NULL;return newhead;}

二、反转一个单链表

题目链接:OJ链接
在这里插入图片描述
在这里插入图片描述

提示:
链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000

思路解析:
在这里插入图片描述

代码演示:

struct ListNode* reverseList(struct ListNode* head) {struct ListNode* move1 = head;struct ListNode* tail = head;if (head == NULL || head->next == NULL) {//如果链表为空或者只有一个结点,则不需要反转return tail;}struct ListNode* move2 = move1->next;while (move2) {struct ListNode* temp = move2->next;//保存下一个结点的地址,防止后面的节点丢失move2->next = move1;move1 = move2;move2 = temp;}tail->next = NULL;//尾结点的next置空struct ListNode* newhead = move1;//move1最后指向了反转链表的起始结点return newhead;
}

三、返回链表的中间结点

题目链接:OJ链接
在这里插入图片描述

提示:
链表的结点数范围是 [1, 100]
1 <= Node.val <= 100

思路解析:
在这里插入图片描述

代码演示:

struct ListNode* middleNode(struct ListNode* head){struct ListNode*move1=head;struct ListNode*move2=head;while(move2!=NULL&&move2->next!=NULL){//此处move2!=NULL和move2->next!=NULLmove1=move1->next;                //的位置不能交换,否则会造成空指针错误move2=move2->next->next;}return move1;
}

四、输出该链表中倒数第k个结点

题目链接:OJ链接
在这里插入图片描述
思路解析:
在这里插入图片描述

代码演示:

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {struct ListNode*move1=pListHead;struct ListNode*move2=pListHead;int i=k;while(i>0&&move2!=NULL){//move2向后移动k位move2=move2->next;i--;}if(move2==NULL&&i>0){//如果k大于链表结点数目,则返回NULLreturn move2;}while(move2){move1=move1->next;move2=move2->next;}return move1;
}

五、将两个有序链表合并

题目链接:OJ链接
在这里插入图片描述
在这里插入图片描述

提示:
两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列

思路解析:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码演示:

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){struct ListNode*move1=list1;struct ListNode*move2=list2;struct ListNode*newnode=NULL;struct ListNode*tail=NULL;while(move1!=NULL&&move2!=NULL){if(move1->val<=move2->val){if(tail==NULL){{//如果newnode为NULL,则tail等于newnode,则直接将结点地址赋予tailnewnode=tail=move1;move1=move1->next;}else{tail->next=move1;move1=move1->next;tail=tail->next;}}else{if(tail==NULL){//如果newnode为NULL,则tail等于newnode,则直接将结点地址赋予tailnewnode=tail=move2;move2=move2->next;}else{tail->next=move2;move2=move2->next;tail=tail->next;}}}if(move1==NULL){//如果链表1遍历完而链表2没有,则将链表2剩余结点尾插到newnode中while(move2!=NULL){if(tail==NULL){//如果newnode为NULL,则tail等于newnode,则直接将结点地址赋予tailnewnode=tail=move2;move2=move2->next;}else{tail->next=move2;move2=move2->next;tail=tail->next;}}}if(move2==NULL){//如果链表2遍历完而链表1没有,则将链表1剩余结点尾插到newnode中while(move1!=NULL){if(tail==NULL){//如果newnode为NULL,则tail等于newnode,则直接将结点地址赋予tailnewnode=tail=move1;move1=move1->next;}else{tail->next=move1;move1=move1->next;tail=tail->next;}}}return newnode;
}

六、链表的回文结构

题目链接:OJ链接

在这里插入图片描述
思路解析:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码演示:

bool chkPalindrome(struct ListNode* A) {struct ListNode* move1 = A;struct ListNode* move2 = A;struct ListNode* move3 = A;struct ListNode* newnode = NULL;struct ListNode* tail = NULL;while (move2 != NULL&&move2->next != NULL ) {//找到中间节点move1 = move1->next;move2 = move2->next->next;}if (move2 == NULL);//如果节点个数为奇数,则move1向后移动一位else {move1 = move1->next;}while (move1 != NULL) {//将后半段链表头插到newnode中if (newnode == NULL) {newnode = tail = move1;move1 = move1->next;tail->next = NULL;}else {struct ListNode* temp = move1->next;move1->next = newnode;newnode = move1;move1 = temp;}}struct ListNode* cmp = newnode;while (move3 != NULL && cmp != NULL) {//比较原链表前半段和newnode是否相同if (move3->val != cmp->val) {return 0;}else {move3 = move3->next;cmp = cmp->next;}}return 1;
}

七、将链表分割成两部分

题目链接:OJ链接
在这里插入图片描述
思路解析:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

代码演示:

ListNode* partition(ListNode* pHead, int x) {struct ListNode*head1=(struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode*head2=(struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode*tail1=head1;struct ListNode*tail2=head2;struct ListNode*move=pHead;while(move){if(move->val<x){tail1->next=move;move=move->next;tail1=tail1->next;}else{tail2->next=move;move=move->next;tail2=tail2->next;}}tail2->next=NULL;//将尾指针的next置空tail1->next=head2->next;struct ListNode*temp1=head1;struct ListNode*temp2=head2;head1=head1->next;//指针指向头结点的下一节点free(temp1);//释放掉创建的头结点free(temp2);return head1;}

八、找出第一个公共结点

题目链接:OJ链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:
函数返回结果后,链表必须 保持其原始结构 。

思路解析:
在这里插入图片描述
在这里插入图片描述

代码演示:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode *move1=headA;struct ListNode *move2=headB;int len1=1,len2=1;while(move1){//得到链表A的长度move1=move1->next;len1++;}while(move2){//得到链表B的长度move2=move2->next;len2++;}int k=abs(len1-len2);//取相减的绝对值struct ListNode *moveA=headA;struct ListNode *moveB=headB;if(len1>len2){//较长的链表走k步while(k--){moveA=moveA->next;}}if(len1<len2){while(k--){moveB=moveB->next;}}while(moveA&&moveB){if(moveA==moveB)return moveA;//若地址相同则返回moveA=moveA->next;moveB=moveB->next;}return NULL;

九、判断链表中是否有环

题目链接:OJ链接
在这里插入图片描述
在这里插入图片描述

提示:

链表中节点的数目范围是 [0, 104]
-105 <= Node.val <= 105
pos 为 -1 或者链表中的一个 有效索引 。

思路解析:
在这里插入图片描述

代码演示:

bool hasCycle(struct ListNode *head) {struct ListNode*move1=head;struct ListNode*move2=head;while(move1&&move2&&move2->next){//此处move2和move2->next的顺序不可交换move1=move1->next;           //否则会导致空指针错误move2=move2->next->next;if(move1==move2)return true;}return false;
}

总结

这九道单链表OJ都是我见过的很经典的题型!
在这里为大家分享一下!
希望有更多的人能够通过这些题目更好地掌握单链表相关的知识!

相关文章:

数据结构——单链表OJ题

单链表OJ题 前言一、删除链表中等于给定值 val 的所有节点二、反转一个单链表三、返回链表的中间结点四、输出该链表中倒数第k个结点五、将两个有序链表合并六、链表的回文结构七、将链表分割成两部分八、找出第一个公共结点九、判断链表中是否有环总结 前言 在前面的博客中我…...

【雕爷学编程】MicroPython动手做(31)——物联网之Easy IoT

1、物联网的诞生 美国计算机巨头微软(Microsoft)创办人、世界首富比尔盖茨&#xff0c;在1995年出版的《未来之路》一书中&#xff0c;提及“物物互联”。1998年麻省理工学院提出&#xff0c;当时被称作EPC系统的物联网构想。2005年11月&#xff0c;国际电信联盟发布《ITU互联网…...

《前端开发 实践之 构建工具的了解》

目录 构建工具的了解Vite 构建工具了解基本使用 构建工具的了解 前端构建工具之一&#xff1a;vite Vite 构建工具了解 todo 基本使用 todo...

MySQL 主从搭建

文章目录 前言一、MySQL 主从是什么&#xff1f;二、通过 Docker 部署三、配置主从关系四、实际情况分析&解决方案五、常见问题处理1、CLONE需要版本不同2、CLONE需要参数相同 总结 前言 MySQL 主从搭建 操作系统&#xff1a;CentOS Linux release 7.9.2009 (Core) 操作系…...

国内GitHub加速访问工具-Fetch GitHub Hosts

一、工具介绍 Fetch GitHub Hosts是一款开源跨平台的国内GitHub加速访问工具&#xff0c;主要为解决研究及学习人员访问 Github 过慢或其他问题而提供的 Github Hosts 同步工具。 项目原理&#xff1a;是通过部署此项目本身的服务器来获取 github.com 的 hosts&#xff0c;而…...

Webpack5新手入门简单配置

1.初始化项目 yarn init -y 2.安装依赖 yarn add -D webpack5.75.0 webpack-cli5.0.0 3.新建index.js 说明&#xff1a;写入下面的一句话 console.log("hello webpack"); 4.执行命令 说明&#xff1a;如果没有安装webpack脚手架就不能执行yarn webpack&#xff08…...

基于ali-oss实现不同类型文件上传不同的bucket

基于ali-oss实现不同类型文件上传不同的bucket,并根据大小选择直接上传还是分片上传 1 配置OSS2 引入依赖3 上传核心代码4 文件回显 1 配置OSS 可以看阿里云文档 ps:记得配置跨域 2 引入依赖 pnpm install ali-oss -save3 上传核心代码 import OSS from "ali-oss"…...

域名校验?反爬界的掩耳盗铃!

这一集我们讲一个比较简单的域名校验&#xff0c;可能你没有听过这个名字&#xff0c;因为这个名字是我编的&#xff0c;那么它究竟是什么呢&#xff1f;又为什么说它是掩耳盗铃呢&#xff1f;我们来看看下面的案例&#xff1a; 必应搜索页隐藏内容虎嗅新闻跳转404 import re…...

Cesium 实战教程 - 调整 3dtiles 倾斜摄影大小

Cesium 实战教程 - 调整 3dtiles 倾斜摄影大小 核心代码完整代码在线示例 之前由于误解遇到一个特殊的需求&#xff1a;想要把三维球上叠加倾斜摄影进行自由放大缩小&#xff0c;跟随地图的缩放进行缩放。 后来经过搜索、尝试&#xff0c;终于实现了需求。 但是&#xff0c;后…...

python机器学习(七)决策树(下) 特征工程、字典特征、文本特征、决策树算法API、可视化、解决回归问题

决策树算法 特征工程-特征提取 特征提取就是将任意数据转换为可用于机器学习的数字特征。计算机无法直接识别字符串&#xff0c;将字符串转换为机器可以读懂的数字特征&#xff0c;才能让计算机理解该字符串(特征)表达的意义。 主要分为&#xff1a;字典特征提取(特征离散化)…...

数据结构与算法中的双向链表

链表概念在现实世界中使用得很普遍。当我们使用 Spotify 播放队列中的下一首歌曲时&#xff0c;我们学到的单链表的概念就开始发挥作用。但是要播放队列中的上一首歌曲到底可以做什么呢&#xff1f; 在这篇博客中&#xff0c;我们将了解与数据结构相关的另一个概念&#xff0c…...

数据安全治理的关键-数据分类分级工具

强大的资产发现能力 多种资产发现方式的组合应用&#xff0c;能够最大程度地提高资产发现能力。 灵活的敏感数据分类分级规则 内置丰富的敏感数据分类分级规则&#xff0c;支持正则表达式、关键词组、非结构化指纹、结构化指纹、机器聚类等多种匹配方式&#xff0c;并且规则…...

Spring集成Junit

目录 1、简介 2、Junit存在的问题 3、回顾Junit注解 4、集成步骤 4.1、导入坐标 4.2、Runwith 4.3、ContextConfiguration 4.4、Autowired 4.5、Test 4.6、代码 5、补充说明 5.1、Runwith 5.2、BlockJUnit4ClassRunner 5.3、没有配置Runwith ⭐作者介绍&#xff1…...

Java正则校验密码至少包含:字母数字特殊符号中的2种

一、语法 字符说明\将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如&#xff0c; n匹配字符 n。\n 匹配换行符。序列 \\\\ 匹配 \\ &#xff0c;\\( 匹配 (。^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性&#xff0c;^ 还会与"\n…...

Stable Diffusion教程(6) - 扩展安装

打开stable diffusion webUI界面 加载插件列表 依次点击扩展->可用->加载自 搜索插件 首先在搜索框输入你要安装的插件&#xff0c;然后点击插件后面的安装按钮 如果你需要的插件这里面没有找到&#xff0c;可通过通网址安装的方式安装。 在git仓库网址输入框输入的你插件…...

Jenkins通过OpenSSH发布WinServer2016

上一篇文章> Jenkins集成SonarQube代码质量检测 一、实验环境 jenkins环境 jenkins入门与安装 容器为docker 主机IP系统版本jenkins10.10.10.10rhel7.5 二、OpenSSH安装 1、下载 官网地址&#xff1a;https://learn.microsoft.com/zh-cn/windows-server/administration/op…...

字母异位词分组 LeetCode热题100

题目 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 思路 将字符串按字符升序排列后作为key&#xff0c;原字符串作为value存储到map上。 代码 class Solution…...

使用angular和electron 构建桌面应用

使用angular和electron 构建桌面应用 初始设置 新建一个angular app npm install -g @angular/cli ng new angular-electron cd angular-electron修改src/index.html文件内容 将绝对路径改为相对路径,加个点,使electron可以访问到angular文件资源 <base href=".…...

安达发制造工业迈向智能化:APS高级计划排程助力提升生产效率

随着市场竞争的加剧&#xff0c;制造企业纷纷寻求提高生产效率和降低成本的方法。近年来&#xff0c;越来越多的制造企业开始采用APS(高级计划与排程)系统&#xff0c;以优化生产计划和排程&#xff0c;提高生产效率&#xff0c;并在竞争中取得优势。 现代制造业通常面临复杂的…...

Flink - sink算子

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 1. Kafka_Sink 2. Kafka_Sink - 自定义序列化器 3. Redis_Sink_String 4. Redis_Sink_list 5. Redis_Sink_set 6. Redis_Sink_hash 7. 有界流数据写入到ES 8. 无界流数据写入到ES 9. 自定…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...