当前位置: 首页 > 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. 自定…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...

写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里

写一个shell脚本&#xff0c;把局域网内&#xff0c;把能ping通的IP和不能ping通的IP分类&#xff0c;并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...

深入解析 ReentrantLock:原理、公平锁与非公平锁的较量

ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...

五、jmeter脚本参数化

目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...

理想汽车5月交付40856辆,同比增长16.7%

6月1日&#xff0c;理想汽车官方宣布&#xff0c;5月交付新车40856辆&#xff0c;同比增长16.7%。截至2025年5月31日&#xff0c;理想汽车历史累计交付量为1301531辆。 官方表示&#xff0c;理想L系列智能焕新版在5月正式发布&#xff0c;全系产品力有显著的提升&#xff0c;每…...

中科院1区顶刊|IF14+:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点

中科院1区顶刊|IF14&#xff1a;多组学MR联合单细胞时空分析&#xff0c;锁定心血管代谢疾病的免疫治疗新靶点 当下&#xff0c;免疫与代谢性疾病的关联研究已成为生命科学领域的前沿热点。随着研究的深入&#xff0c;我们愈发清晰地认识到免疫系统与代谢系统之间存在着极为复…...

暴雨新专利解决服务器噪音与性能悖论

6月1日&#xff0c;我国首部数据中心绿色化评价方面国家标准《绿色数据中心评价》正式实施&#xff0c;为我国数据中心的绿色低碳建设提供了明确指引。《评价》首次将噪音控制纳入国家级绿色评价体系&#xff0c;要求从设计隔声结构到运维定期监测实现闭环管控&#xff0c;加速…...