【数据结构】单链表OJ题(二)

🔥博客主页:小王又困了

📚系列专栏:数据结构

🌟人之为学,不日近则日退 

❤️感谢大家点赞👍收藏⭐评论✍️


目录

一、链表分割

💡方法一:

二、链表的回文

💡方法一: 

三、相交链表

💡方法一: 

四、环形链表

 💡方法一: 


🗒️前言:

在上一期中我们给大家介绍了单链表,也了解了单链表的实现。接下来就让我们进入实践,练习一些经典题目,让我们对单链表的理解更加深入

一、链表分割

题目:

💡方法一:

我们创建两条链表,把小于x的节点放在一条链表中,剩余的放在另一条节点,最后将两条链表连接起来。在这里要使用带哨兵位的链表,不用考虑头插和第一条链表为空的问题,可以大大减少代码量。

 注意:要将链表最后一个节点的指针域置为空,不然会导致链表循环。

ListNode* partition(ListNode* pHead, int x) 
{struct ListNode* lhead ,*ltail,*ghead,*gtail;ghead=gtail=(struct ListNode*)malloc(sizeof(struct ListNode));lhead=ltail=(struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* cur=pHead;while(cur){if(cur->val<x){ltail->next=cur;ltail=ltail->next;}else  {gtail->next=cur;gtail=gtail->next;}cur=cur->next;}ltail->next=ghead->next;gtail->next=NULL;struct ListNode* head=lhead->next;free(ghead);free(lhead);return head;
}

二、链表的回文

题目:

💡方法一: 

我们先找到中间节点,然后将后面的节点反转,分别从头节点和中间节点开始比较,如果两两节点的数据域有一对不相等,返回flase;如果都相等返回true。

class PalindromeList {public://找中间节点struct ListNode* middleNode(struct ListNode* head) {struct ListNode* fast = head;struct ListNode* slow = head;while (fast && fast->next) {fast = fast->next->next;slow = slow->next;}return slow;}//反转链表struct ListNode* reverseList(struct ListNode* head) {struct ListNode* cur = head;struct ListNode* newnode = NULL;while (cur) {//保存节点struct ListNode* next = cur->next;//头插cur->next = newnode;newnode = cur;cur = next;}return newnode;}bool chkPalindrome(ListNode* head) {   struct ListNode* mid=middleNode(head);struct ListNode* rmid=reverseList(mid);struct ListNode* cur=head;while(rmid&&cur){if(rmid->val!=cur->val){return false;}else {rmid=rmid->next;cur=cur->next;}}return true;}
};

三、相交链表

题目:

💡方法一: 

在做这道题,我们可以分为两步:

1.判断是否相交:

        遍历两条链表,比较最后一个节点的地址,地址相等,说明两条链表相交。

2.找起始节点:

        先计算出两条链表的长度,计算出它们的差值,让长的链表先走差距步,然后两条链表一起走,相等时返回的就是相交的起始节点。

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{struct ListNode* curA=headA,*curB=headB;int lenA=1,lenB=1;while(curA->next){curA=curA->next;lenA++;}while(curB->next){curB=curB->next;lenB++;}if(curA->next!=curB->next){return NULL;}//求两链表的差距int gap=abs(lenA-lenB);struct ListNode* longlist=headA,*shortlist=headB;if(lenA<lenB){longlist=headB;shortlist=headA;}//长链表先走差距步while(gap--){longlist=longlist->next;}while(longlist!=shortlist){longlist=longlist->next;shortlist=shortlist->next;}return longlist;
}

四、环形链表

题目:

 💡方法一: 

 当我们定义快慢指针,快指针一次走两步,慢指针一次走一步。如果链表存在环,在进入环中快指针一定可以追上慢指针。因为每走一步距离就减1,当减到0时就追上了。

  • 假设起点到入口点距离为L
  • 假设环的周长为C
  • 假设入口点到相遇点的距离为X

我们通过快慢指针走过的路程来判断,但在这里要注意环的周长很小时,所以在这里要考虑两种情况: 

情况一:slow进环后一圈之内,fast一定追上slow

  • slow走的距离:L+X
  • fast走的距离:L+C+X

情况二:slow进环时,fast已经走了n圈

  • slow走的距离:L+X
  • fast走的距离:L+nC+X 

由于快指针速度使慢指针的二倍,所以快指针走的路程也是慢指针的二倍。由此可得出:

结论:慢指针从起点开始走,快指针从相遇点开始走,它们最终会相遇在入口点。

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

本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。你们的支持就是博主最大的动力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/84104.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elastic Stack 8.9:更快的跨集群搜索和指标聚合

作者&#xff1a;Tyler Perkins, Gilad Gal, Teresa Soler, Shani Sagiv, Bernhard Suhm, George Kobar Elastic Stack 8.9 在多个方面实现了显着的性能改进&#xff1a;Kibana 中更快的跨集群搜索、Elasticsearch 更快的聚合&#xff0c;以及更快、更相关的向量搜索&#xff0…

cpu的架构

明天继续搞一下cache,还有后面的, 下面是cpu框架图 开始解释cpu 1.控制器 控制器又称为控制单元&#xff08;Control Unit&#xff0c;简称CU&#xff09;,下面是控制器的组成 1.指令寄存器IR:是用来存放当前正在执行的的一条指令。当一条指令需要被执行时&#xff0c;先按…

自定义类型详解

目录 前言 本期内容介绍 一、结构体 1.1什么是结构体&#xff1f; 1.2结构体的声明 1.3结构的特殊声明 1.4结构体变量的定义和初始化 1.5结构体成员的访问 1.6结构体传参 1.7结构体的自引用 1.8结构体内存对齐 1.9为什么有内存对齐&#xff1f; 1.a修改默认对齐数…

网工内推 | 自动化企业招网工,包吃,最高15K,厂商认证优先

01 影儿集团 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、负责公司及分支站点网络架构设计规划、组建、优化及日常运维管理工作&#xff1b; 2、负责公司网络安全、网络质量及网络和安全设备等检查与监控&#xff1b; 3、负责网络设备安全策略的配置及优化&#…

Jmeter(四) - 从入门到精通 - 创建网络测试计划(详解教程)

1.简介 在本节中&#xff0c;您将学习如何创建基本的 测试计划来测试网站。您将创建五个用户&#xff0c;这些用户将请求发送到JMeter网站上的两个页面。另外&#xff0c;您将告诉用户两次运行测试。因此&#xff0c;请求总数为&#xff08;5个用户&#xff09;x&#xff08;2…

react搭建在线编辑html的站点——引入grapes实现在线拖拉拽编辑html

文章目录 ⭐前言⭐搭建react ts项目⭐引入grapes 插件⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于react搭建在线编辑html的站点。 react 发展历史 React是由Facebook开发的一种JavaScript库&#xff0c;用于构建用户界面。React最初发布于2013年&…

C++/Qt读写ini文件

今天介绍C/Qt读写ini文件&#xff0c;ini文件一般是作为配置文件来使用&#xff0c;比如一些程序的一些默认参数会写在一个ini文件中&#xff0c;程序运行时会进行对应的参数读取&#xff0c;详细可以查看百度ini文件的介绍。https://baike.baidu.com/item/ini%E6%96%87%E4%BB%…

Redis的简介,安装(Linux、Windows),配置文件的修改---详细介绍

Redis基础 Redis是一个基于内存的key-value结构数据库。 基于内存存储&#xff0c;读写性能高适合存储热点数据&#xff08;热点商品、资讯、新闻)企业应用广泛 1、Redis入门 1.1、Redis简介 The open source, in-memory data store used by millions of developers as a …

福布斯发布2023云计算100强榜单,全球流程挖掘领导者Celonis排名17

近日&#xff0c;全球流程挖掘领导者Celonis入选福布斯2023 年云计算 100 强榜单&#xff0c;估值130亿美元&#xff0c;排名第17&#xff0c;Celonis已经是连续三年跻身榜单前20名。 本次榜单由福布斯与Bessemer Venture Partners和Salesforce Ventures联合发布&#xff0c;旨…

SpringBoot整合WebSocket实现定时任务消息推送

在平时项目开发中&#xff0c;肯定有很多小伙伴会需要实现定时向某个页面推送消息的功能&#xff0c;为了解决大家无从下手的问题&#xff0c;加哥今天展示一套简单的代码解决方案。 1.创建WebSocketConfig配置类 在这个类中注入ServerEndpointExporter&#xff0c;这个bean会…

putty使用记录

在官网下载并安装putty 一、SSH 二、FTP open 192.168.1.118 put -r C:\Users\Administrator\Desktop\test /opt/lanren312/test # 上传&#xff08;文件夹&#xff09; get -r /opt/lanren312/test C:\Users\Administrator\Desktop\test2 # 下载&#xff08;文件夹&#xff…

教你如何实现接口防刷

教你如何实现接口防刷 前言 我们在浏览网站后台的时候&#xff0c;假如我们频繁请求&#xff0c;那么网站会提示 “请勿重复提交” 的字样&#xff0c;那么这个功能究竟有什么用呢&#xff0c;又是如何实现的呢&#xff1f; 其实这就是接口防刷的一种处理方式&#xff0c;通…

【linux--->高级IO】

文章目录 [TOC](文章目录) 一、五种IO模型概念1.阻塞IO2.非阻塞IO3.信号驱动IO4.多路复用/多路转接IO5.异步IO 二、非阻塞IO之fcntl应用1.fcntl系统调用接口介绍2.用fcntl实现非阻塞IO 三、多路转接IO之select应用1.select接口介绍2.使用select实现多路转接IOselect的优缺点 四…

算法练习--链表相关

文章目录 合并两个有序链表删除排序链表中的重复元素 1删除排序链表中的重复元素 2环形链表1环形链表2相交链表反转链表 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。 新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&…

JVM面试题

JVM理论 #JVM内存模型# Java内存模型&#xff08;JMM&#xff09;&#xff1f; Java的内存模型决定了线程间的通信方式&#xff0c;JMM的模型是由主存和工作内存构成&#xff0c;两个线程想要正常通信需要将工作内存中的变量刷到主存中&#xff0c;另一个线程才能正确读取得…

SpringBoot 升级内嵌Tomcat

SpringBoot 更新 Tomcat 最近公司的一个老项目需要升级下Tomcat&#xff0c;由于这个项目我完全没有参与&#xff0c;所以一开始我以为是一个老的Tomcat项目&#xff0c;升级它的Tomcat依赖或者是Tomcat容器镜像&#xff0c;后面发现是一个SpringBoot项目&#xff0c;升级的是…

基于SpringBoot+LayUI的宿舍管理系统 001

项目简介 源码来源于网络&#xff0c;项目文档仅用于参考&#xff0c;请自行二次完善哦。 系统以MySQL 8.0.23为数据库&#xff0c;在Spring Boot SpringMVC MyBatis Layui框架下基于B/S架构设计开发而成。 系统中的用户分为三类&#xff0c;分别为学生、宿管、后勤。这三…

SQL ASNI where from group order 顺序 where和having,SQL底层执行原理

SQL语句执行顺序&#xff1a; from–>where–>group by -->having — >select --> order 第一步&#xff1a;from语句&#xff0c;选择要操作的表。 第二步&#xff1a;where语句&#xff0c;在from后的表中设置筛选条件&#xff0c;筛选出符合条件的记录。 …

STM32--EXTI外部中断

前文回顾---STM32--GPIO 相关回顾--有关中断系统简介 目录 STM32中断 NVIC EXTI外部中断 AFIO EXTI框图 旋转编码器简介 对射式红外传感器工程 代码&#xff1a; 旋转编码器工程 代码&#xff1a; STM32中断 先说一下基本原理&#xff1a; 1.中断请求发生&#xff1a…

Profibus-DP转modbus RTU网关modbus rtu和tcp的区别

捷米JM-DPM-RTU网关在Profibus总线侧实现主站功能&#xff0c;在Modbus串口侧实现从站功能。可将ProfibusDP协议的设备&#xff08;如&#xff1a;EH流量计、倍福编码器等&#xff09;接入到Modbus网络中&#xff1b;通过增加DP/PA耦合器&#xff0c;也可将Profibus PA从站接入…