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

【数据结构初阶】单链表面试题|内含链表带环问题

目录

前言

链表面试题 

1. 删除链表中等于给定值 val 的所有节点。oj链接

2.反转一个单链表。oj链接

3. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。oj链接

 4. 输入一个链表,输出该链表中倒数第k个结点。oj链接

5. 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 oj链接

6. 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 。oj链接

7. 链表的回文结构。 oj链接

8. 输入两个链表,找出它们的第一个公共结点。 oj链接

9. 给定一个链表,判断链表中是否有环。 oj链接

10. 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL。 oj链接

 总结


前言

上篇文章学习了单链表的原理以及实现,这节课我们来做几道链表的oj题来练练手吧。


链表面试题 

1. 删除链表中等于给定值 val 的所有节点。oj链接

我们对链表进行遍历,保存上一个结点prev,如果不等于val,那就不进行操作,如果等于val,我们就直接将prev的next指向当前位置的next,堆该结点进行删除。

struct ListNode* removeElements(struct ListNode* head, int val){struct ListNode* prve=head,*cur=head;while(cur){if(cur->val==val){if(cur==head){head=cur->next;cur=cur->next;}else{prve->next=cur->next;cur=cur->next;}}else{prve=cur;cur=cur->next;}}return head;
}

2.反转一个单链表。oj链接

 

 我们使用三指针法,使用cur保存当前结点,使用next保存当前结点的next,每次只需将cur的next指向newhead即可。

struct ListNode* reverseList(struct ListNode* head)
{struct ListNode* cur=head;struct ListNode* newhead=NULL;while(cur){struct ListNode* next=cur->next;cur->next=newhead;newhead=cur;cur=next;}return newhead;
}

3. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。oj链接

 

 快指针一次走两步,慢指针一次走一步,当快指针走到空或快指针的next走到空时,此时慢指针就这中间结点处。

struct ListNode* middleNode(struct ListNode* head){struct ListNode* fast,*slow;slow=fast=head;while(fast&&fast->next){fast=fast->next->next;slow=slow->next;}return slow;
}

 4. 输入一个链表,输出该链表中倒数第k个结点。oj链接

 这道题还可以通过快慢指针来解决,快指针先走k步,然后慢指针和快指针一块走,当快指针指向空时,慢指针就到了倒数第k个位置。

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {struct ListNode* fast,*slow;fast=slow=pListHead;while(k--){if(!fast)return NULL;elsefast=fast->next;}while(fast){fast=fast->next;slow=slow->next;}return slow;
}

5. 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 oj链接

 这里我们使用归并的思想,比较两个链表的值,小的插入新的链表。

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){struct ListNode* head=NULL;struct ListNode* cur=NULL;if(!list1)return list2;if(!list2)return list1;while(list1&&list2){if(list1->val > list2->val){if(head==NULL)cur=head=list2;else{cur->next=list2;cur=list2;}list2=list2->next;}else{if(head==NULL)cur=head=list1;else{cur->next=list1;cur=list1;}list1=list1->next;}}if(list1)cur->next=list1;if(list2)cur->next=list2;return head;
}

6. 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 。oj链接

开两个带哨兵位的结点,分别插入大于x的数和小于x的数,大于x尾插到greatTail,小于x插入lessTail,最终将两个链表连起来。

class Partition {public:struct ListNode* partition(struct ListNode* head, int x) {struct ListNode* lessHead, * lessTail, * greaterHead, *greaterTail;struct ListNode* cur = head;lessHead = lessTail = (struct ListNode*)malloc(sizeof(struct ListNode));lessHead->next=NULL;greaterHead = greaterTail = (struct ListNode*)malloc(sizeof(struct ListNode));greaterHead->next = NULL;while (cur) {if (cur->val < x) {lessTail->next = cur;lessTail = cur;} else {greaterTail->next = cur;greaterTail = cur;}cur = cur->next;}lessTail->next = greaterHead->next;greaterTail->next = NULL;struct ListNode* newnode = lessHead->next;free(lessHead);free(greaterHead);return newnode;}
};

7. 链表的回文结构。 oj链接

 可以找到链表的中间结点,然后将中间结点后边逆置,当前边与后边相同时,说明是回文结构。

struct ListNode* reverseList(struct ListNode* head)
{struct ListNode* cur=head;struct ListNode* newhead=NULL;while(cur){struct ListNode* next=cur->next;cur->next=newhead;newhead=cur;cur=next;}return newhead;
}
class PalindromeList {
public:bool chkPalindrome(ListNode* A) {struct ListNode* fast,* slow;fast=slow=A;while(fast&&fast->next){fast=fast->next->next;slow=slow->next;}ListNode* newHead=slow;struct ListNode* B= reverseList(slow);while(B->next&&A->next){if(A->val!=B->val){return false;}else {A=A->next;B=B->next;}}return true;}
};

8. 输入两个链表,找出它们的第一个公共结点。 oj链接

 判断是否有公共结点只需要判断两个链表的最后一个结点是否相同,而要找到第一个相遇结点时,我们可以使两个链表同时走,第一个相等的结点就是第一个公共结点。

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode* curA=headA;struct ListNode* curB=headB;int lenA=1;int lenB=1;while(curA->next){curA=curA->next;lenA++;}while(curB->next){curB=curB->next;lenB++;}if(curA!=curB)return NULL;int num=abs(lenA-lenB);struct ListNode *longlist=headA;struct ListNode *shortlist=headB;if(lenA<lenB){longlist=headB;shortlist=headA;}while(num--){longlist=longlist->next;}while(longlist!=shortlist){longlist=longlist->next;shortlist=shortlist->next;}return longlist;
}

9. 给定一个链表,判断链表中是否有环。 oj链接

 我们可以通过使用快慢指针,快指针每次走两步,慢指针每次走一步,他们如果相遇那么说明这个链表是带环的,下边附上我的手写证明。

 

bool hasCycle(struct ListNode *head) {struct ListNode*fast,*slow;fast=slow=head;while(fast&&fast->next){fast=fast->next->next;slow=slow->next;if(slow==fast)return true;}return false;
}

10. 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL。 oj链接

附上手写证明 

 

struct ListNode *detectCycle(struct ListNode *head) {struct ListNode*fast,*slow,*meet;fast=slow=head;while(fast&&fast->next){fast=fast->next->next;slow=slow->next;if(slow==fast){meet=slow;while(head!=meet){head=head->next;meet=meet->next;}return meet;}}return NULL;
}

 总结

今天我们讲解了十道链表面试题,希望可以帮到大家。

相关文章:

【数据结构初阶】单链表面试题|内含链表带环问题

目录 前言 链表面试题 1. 删除链表中等于给定值 val 的所有节点。oj链接 2.反转一个单链表。oj链接 3. 给定一个带有头结点 head 的非空单链表&#xff0c;返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点。oj链接 4. 输入一个链表&#xff0c;…...

一文解析ethtool 命令的使用

命令简介 ethtool命令用于查询和控制网络设备驱动程序和硬件设置&#xff0c;尤其是有线以太网设备&#xff0c;devname网卡的名称。网卡就像是交换机的一个端口&#xff0c;正常使用我们只是配置网卡IP地址等信息&#xff0c;网卡的速率、双工模式等我们并不关心。通过ethtoo…...

深度学习训练营之yolov5训练自己的数据集

深度学习训练营之训练自己的数据集原文链接环境介绍准备好数据集划分数据集运行voc_train.py遇到问题完整代码创建new_data.yaml文件模型训练时遇到的报错模型训练结果可视化参考链接原文链接 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f…...

Java中的AQS

文章目录什么是AQSAbstractQueuedSynchronizer方法解析自旋与阻塞ReentrantLock&#xff0c;Semaphore以及CountDownLatch对比ReentrantLock实现原理原理ReentrantLock源码中compareAndSetState的方法Semaphore实现原理CountDownLatch实现原理什么是AQS AQS是Java中的一个抽象…...

Spring——案例-业务层接口执行效率和AOP通知获取数据+AOP总结

执行时间获取:记录开始时间和结束时间&#xff0c;取差值。 这里使用环绕通知来实现。 环境准备: 项目文件结构: 业务层接口和实现类: 数据层: 采用mybatis注解开发&#xff0c;这里没有实现类&#xff0c;直接在接口方法里面实现映射。 domain层: 实现了数据库里面每一个…...

国外SEO舆情处理最佳黄金时间

在国外市场&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;的舆情处理是非常重要的&#xff0c;因为它可以帮助提高网站的排名和流量&#xff0c;并且建立品牌的声誉和信誉。 然而&#xff0c;在什么时间进行舆情处理是一个值得探讨的问题。 在本文中&#xff0c;我们将…...

ROC和AUC

目录 ROC AUC ROC ROC曲线是Receiver Operating Characteristic Curve的简称&#xff0c;中文名为"受试者工作特征曲线"。ROC曲线的横坐标为假阳性率(False Postive Rate, FPR)&#xff1b;纵坐标为真阳性率(True Positive Rate, TPR).FPR和TPR的计算方法分别为 F…...

Dopamine-PEG-cRGD,DOPA-PEG-cRGD,多巴胺-聚乙二醇-crgd细胞穿膜肽

名称:多巴胺-聚乙二醇-cRGD穿膜肽,多巴胺-聚乙二醇-crgd细胞穿膜肽英文名称:Dopamine-PEG-cRGD,DOPA-PEG-cRGD规格:50mg,100mg,150mg(根据要求可定制&#xff09;描述&#xff1a;cRGD多肽序列: cyclo(RGDfK)外 观 : 半固体或固体&#xff0c;取决于分子量。溶解性&#xff1a;…...

动态规划回文子串

647. 回文子串方法&#xff1a;双指针回文子串有长度为奇数和偶数两种&#xff0c;extend(s, i, i, n); extend(s, i, i 1, n);就分别对应长度为奇数和偶数的情况class Solution { private:int extend(const string& s, int i, int j, int n) {int res 0;while (i > 0…...

windows 域控提权CVE-2014-6324CVE-2020-1472CVE-2021-42287CVE-2022-26923

一、CVE-2014-6324复现 环境&#xff1a;god.org域&#xff0c;两台主机&#xff0c;一台win2008域控&#xff0c;另一台web服务器win2008 工具&#xff1a;ms14-068.exe(漏洞exp) mimikatz psexec 利用条件&#xff1a; 1.域用户账号密码 2.获得一台主机权限(本地administ…...

1、JDK 安装 Java环境变量配置

jdk下载&#xff08;Java8&#xff09; &#xff08;下载时间不同&#xff0c;小版本号会有变化&#xff0c;不影响后续安装&#xff09; 官网下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8-windows 下载完后安装 JDK 环境变量配置 Win…...

[c++]list模拟实现

目录 前言&#xff1a; 学习类的方式&#xff1a; 1 类成员变量 1.1 list成员变量 1.2 结点结构体变量 1.3 迭代器成员变量 2 默认函数——构造 2.1 结点结构体构造函数 2.2 list构造函数 2.3 迭代器构造函数 3 迭代器实现 3.1 list部分 3.2 迭代器结构体部分 3.2…...

实用的仓库管理软件有哪些,盘点2023年5大仓库管理软件!

对于做批发生意的老板或工厂老板来说&#xff0c;选择一款实用的仓库管理软件是至关重要的。仓库管理软件除了可以帮你降低仓库管理成本&#xff0c;提高经营管理的效率&#xff0c;还能够在手机上随时随地掌控仓库员工和商品的最新信息&#xff0c;与客户、供应商的订单情况能…...

(八十二)透彻研究通过explain命令得到的SQL执行计划(1)

今天我们正式进入研究explain命令得到的SQL执行计划的内容了&#xff0c;只要把explain分析得到的SQL执行计划都研究透彻&#xff0c;完全能看懂&#xff0c;知道每个执行计划在底层是怎么执行的&#xff0c;那么后面学习SQL语句的调优就非常容易了。 首先&#xff0c;我们现在…...

【Linux】旋转锁 | 读写锁

在之前的线程学习中&#xff0c;用到的锁都是挂起等待锁&#xff0c;如果申请不到锁&#xff0c;那就会在锁中等待&#xff1b; 自旋锁则不大相似 文章目录1.自旋锁1.1 概念1.2 接口1.2.1 pthread_spin_init/destroy1.2.2 pthread_spin_lock1.2.3 pthread_spin_unlock2.读写锁…...

EasyExcell导出excel添加水印

EasyExcell导出excel添加水印1、添加easyExcel相关依赖2、准备基础工具类3、创建水印handler类4、创建单元测试类WriteTest.class5、测试结果1、添加easyExcel相关依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId&…...

SpringCloud:Nacos配置管理

Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。我们需要一种统一配置管理方案&#xff0c;可以集中管理…...

正则表达式引擎NFA自动机的回溯解决方案总结

前几天线上一个项目监控信息突然报告异常&#xff0c;上到机器上后查看相关资源的使用情况&#xff0c;发现 CPU 利用率将近 100%。通过 Java 自带的线程 Dump 工具&#xff0c;我们导出了出问题的堆栈信息。 我们可以看到所有的堆栈都指向了一个名为 validateUrl 的方法&#…...

卷积神经网络之AlexNet

目录概述AlexNet特点激活函数sigmoid激活函数ReLu激活函数数据增强层叠池化局部相应归一化DropoutAlexnet网络结构网络结构分析AlexNet各层参数及其数量模型框架形状结构关于数据集训练学习keras代码示例概述 由于受到计算机性能的影响&#xff0c;虽然LeNet在图像分类中取得了…...

React中setState什么时候是同步的,什么时候是异步的?

本文内容均针对于18.x以下版本 setState 到底是同步还是异步&#xff1f;很多人可能都有这种经历&#xff0c;面试的时候面试官给了你一段代码&#xff0c;让你说出输出的内容&#xff0c;比如这样&#xff1a; constructor(props) {super(props);this.state {val: 0}}compo…...

优秀开源软件的类,都是怎么命名的?

日常编码中&#xff0c;代码的命名是个大的学问。能快速的看懂开源软件的代码结构和意图&#xff0c;也是一项必备的能力。 Java项目的代码结构&#xff0c;能够体现它的设计理念。Java采用长命名的方式来规范类的命名&#xff0c;能够自己表达它的主要意图。配合高级的 IDEA&…...

绘制CSP的patterns矩阵图

最近在使用FBCSP处理数据,然后就想着看看处理后的样子,用地形图的形式表现出来,但是没有符合自己需求的函数可以实现,就自己尝试的实现了一下,这里记录一下,方便以后查阅。 绘制CSP的patterns矩阵图 对数据做了FBCSP处理,但是想画一下CSP计算出来的patterns的地形图,并…...

Datatables展示数据(表格合并、日期计算、异步加载数据、分页显示、筛选过滤)

系列文章目录 datatable 自定义筛选按钮的解决方案Echarts实战案例代码(21)&#xff1a;front-endPage的CJJTable前端分页插件ajax分页异步加载数据的解决方案 文章目录系列文章目录前言一、html容器构建1.操作按钮2.表格构建二、时间日期计算三、dataTables属性配置1.调用2.过…...

Python decimal模块的使用

Python decimal 模块Python中的浮点数默认精度是15位。Decimal对象可以表示任意精度的浮点数。getcontext函数用于获取当前的context环境&#xff0c;可以设置精度、舍入模式等参数。#在context中设置小数的精度 decimal.getcontext().prec 100通过字符串初始化Decimal类型的变…...

pycharm常用快捷键

编辑类&#xff1a; Ctrl D 复制选定的区域或行 Ctrl Y 删除选定的行 Ctrl Alt L 代码格式化 Ctrl Alt O 优化导入&#xff08;去掉用不到的包导入&#xff09; Ctrl 鼠标 简介/进入代码定义 Ctrl / 行注释 、取消注释 Ctrl 左方括号 快速跳到代码开头 Ctrl 右方括…...

useCallback 与 useMemo 的区别 作用

useCallback 缓存钩子函数&#xff0c;useMemo 缓存返回值&#xff08;计算结果&#xff09;。 TS声明如下&#xff1a;type DependencyList ReadonlyArray<any>;function useCallback<T extends (...args: any[]) > any>(callback: T, deps: DependencyList)…...

Mybatis的学习

01-mybatis传统dao开发模式 概述 mybatis有两种使用模式: ①传统dao开发模式, ②dao接口代理开发模式 ①传统dao开发模式 dao接口 dao实现子类 mapper映射文件dao实现子类来决定了dao接口的方法和mapper映射文件的statement的关系 代码实现 public class StudentDaoImpl im…...

PyTorch深度学习实战 | 计算机视觉

深度学习领域技术的飞速发展&#xff0c;给人们的生活带来了很大改变。例如&#xff0c;智能语音助手能够与人类无障碍地沟通&#xff0c;甚至在视频通话时可以提供实时翻译&#xff1b;将手机摄像头聚焦在某个物体上&#xff0c;该物体的相关信息就会被迅速地反馈给使用者&…...

力扣(LeetCode)436. 寻找右区间(2023.03.10)

给你一个区间数组 intervals &#xff0c;其中 intervals[i] [starti, endi] &#xff0c;且每个 starti 都 不同 。 区间 i 的 右侧区间 可以记作区间 j &#xff0c;并满足 startj > endi &#xff0c;且 startj 最小化 。 返回一个由每个区间 i 的 右侧区间 在 interv…...

已解决Servlet中Request请求参数中文乱码的问题

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…...