链表OJ刷题(二)

制作不易,三连支持一下呗!!!

文章目录

  • 前言
  • 一、链表的回文结构
  • 二、相交链表
  • 三、链表中倒数第k个节点
  • 四、环形链表Ⅰ和Ⅱ
  • 总结


前言


一、链表的回文结构

链表的回文结构_牛客题霸_牛客网

这里我们需要先了解一下什么叫做回文:从前向后看与从后向前看的结果是一样的,我们就称为回文结构!!!

思路: 这道题目是我们之前链表OJ(一)中两道经典题目的结合------查找中间节点与链表的逆置。

我们可以先找到链表的中间节点(如果链表节点个数为偶数,有两个中间节点,我们选取靠后的那一个),然后将链表的中间节点以后的节点全部逆置。最后循环遍历原链表的前半部分和逆置得到的后半部分是否相同,如果相同就是回文结构,反之就不是。

 我们只需要将这两个步骤分别实现成函数来调用即可

代码实现:

struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};
typedef struct ListNode ListNode;
//查找中间节点
struct ListNode* middleNode(struct ListNode* head) {ListNode* pfast,*pslow;pfast=pslow=head;while(pfast&&pfast->next){pfast=pfast->next->next;pslow=pslow->next;}return pslow;
}
//逆置所传链表
struct ListNode* reverseList(struct ListNode* head) {if(!head){return head;}ListNode*prev,*pcur,*next;prev=NULL;pcur=head;next=head->next;while(pcur){pcur->next=prev;prev=pcur;pcur=next;if(next)next=next->next;}return prev;
}
class PalindromeList {
public:bool chkPalindrome(ListNode* A) {// write code hereif(!A)return true;ListNode* mid=middleNode(A);mid= reverseList(mid);//循环遍历两个链表,进行比较while(mid){if(A->val!=mid->val)return false;mid=mid->next;A=A->next;}return true;}
};

二、相交链表

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

 思路一:计算两个链表的长度

 步骤:

1.先判断是否相交:

如果两个链表的尾节点相同则一定是相交的,如果连尾节点都不同,则一定不相交。

2.找到相交的起始节点:

先分别通过循环遍历的方式计算出两个链表的长度lenA和lenB,用gap来表示它们之间的差值,让长链表先遍历gap步,以保证此时链表的长度是相同的,最后循环遍历两个链表,如果出现链表A和链表B的节点是相同的,则表示这个节点就是我们要找的节点。

代码实现:

 typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {int lenA=0,lenB=0;ListNode* curA=headA,*curB=headB;//计算链表A的长度while(curA){lenA++;curA=curA->next;}//计算链表B的长度while(curB){lenB++;curB=curB->next;}//判断尾节点是否相同if(curA!=curB){return NULL;}int gap=abs(lenA-lenB);ListNode* longlist=headA;ListNode* shortlist=headB;if(lenB>lenA){longlist=headB;shortlist=headA;}//让长链表先走gap步while(gap--){longlist=longlist->next;}//循环找相交起始节点while(longlist!=shortlist){longlist=longlist->next;shortlist=shortlist->next;}return longlist;
}

思路二: 走相同的路,彼此一定会相遇

除了计算链表长度外,我们可以通过两个链表长度和相同的性质来解题

过程:遍历其中一个链表,当到末尾时跳到另一个链表继续遍历,直到再次到达末尾

1.如果链表不相交,则两个遍历指针同时指向NULL,返回NULL即可。

2.如果链表相交,因为两个遍历指针同时达到末尾,向前推理可知,两个指针一定会有同时指向相交的起始节点的时候。

3.如果两个链表等长,也会同时到达相交的起始节点。

代码实现:

这个思路实现起来就比较简洁,但是不容易想到!!! 

三、链表中倒数第k个节点 

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路一:求出链表长度,确定所求节点是第几个节点

思路非常简单

代码实现:

思路二:双指针法

受链表的中间节点一题的启发,我们这里依旧可以使用快慢指针,只需要将快慢指针的距离控制在k,当快指针走到链表末尾时,慢指针正好到达所求节点。

代码实现:

四 、环形链表Ⅰ和Ⅱ

环形链表Ⅰ:

https://leetcode.cn/problems/linked-list-cycle/

思路: 快慢指针法

定义一个快指针,一个慢指针,快指针一次走两步,慢指针一次走一步。如果此链表带环则,快慢两个指针一定会相遇,如果此链表不带环,则fast指针或fast->next最后一定会是NULL。

代码实现:

typedef struct ListNode ListNode;
bool hasCycle(struct ListNode *head) {ListNode* fast=head,*slow=head;while(fast&&fast->next)//注意:顺序不能调换,否则可能会存在短路的情况{fast=fast->next->next;slow=slow->next;if(fast==slow){return true;}}return false;
}

接下来我们从数学的角度解释为什么两个指针一定会相遇:

 

假设上图是一个带环链表 ,当slow也进环时,假设fast与环的入口之间的距离是X,环的长度是C

由于两个指针的速度差是1 ,总有一天fast指针会追上slow指针,并不会错过,并且此时slow指针一定还没有走够一圈(因为X<C),所以我们就证明了一个指针走两步,一个指针走一步一定可以追上!!!


同理 如果一个指针走三步,一个指针走一步,我们也可以用相同的思路来验证是否一定会追上:

答案是一定会。

假设slow进环时两个指针的位置如上图所示。 

一.假设此时两个指针的距离N为偶数,则因为每走一步两个指针的距离缩小2,那么在第一轮fast一定可以追上slow(并且此时slow并未转够一圈)!!!

二.如果N为奇数,则第一圈并不能追上,则两个指针的距离在经过第一轮追击之后会变为C-1(C为环的长度)。

1.如果C-1是偶数,则下一轮就一定可以追上。

2.如果C-1是奇数,则永远也追不上!!!

问题是:N为奇数和C-1是奇数是否可以同时成立呢?

我们假设未进环时slow走的距离是L,slow刚进环时slow和fast的距离是N,环的长度是C,fast已经转了x圈。

slow走的距离是:L

fast走的距离是:L+x*C+N

因为fast的速度是slow的3倍,则3L=L+x*C+N

推出:2L=x*C+N

2L一定是偶数,如果C-1和N同时为奇数,则x*C一定是偶数,x*C+N就一定是奇数,两边不可能相等,矛盾!!!

因此只要N为奇数时,fast一定可以在第二轮追击中追上slow

也就是说,不管如何,fast一定能够追上slow!!!

但是由于fast走两步,slow走一步写起来更简单,我们选择这种方法。


总结

环形链表的逻辑推理很重要!!!

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

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

相关文章

React之组件定义和事件处理

一、组件的分类 在react中&#xff0c;组件分为函数组件和class组件&#xff0c;也就是无状态组件和有状态组件。 * 更过时候我们应该区别使用无状态组件&#xff0c;因为如果有状态组件会触发生命周期所对应的一些函数 * 一旦触发他生命周期的函数&#xff0c;它就会影响当前项…

MQL5学习之RSI指标编写

研究MT5时发现MQL5这个指标编写功能很强大&#xff0c;应该是碾压国内所有的指标系统&#xff0c;不过这个东西相对复杂很多&#xff0c;比通达信公式不知复杂几许&#xff0c;看起来和C语法接近&#xff0c;倒是比较适合自己。试着玩一下&#xff0c;发现还是有点难度的。索性…

修改centos7的dns解决docker拉取镜像超时问题

近期在一台centos7的服务器上部署系统&#xff0c;拉取docker镜像时总是超时&#xff0c;如图所示。网上有教程说&#xff0c;可以修改操纵系统的dns地址&#xff0c;试了一下&#xff0c;果然搞定。 打开dns配置文件 sudo vi /etc/resolv.conf发觉里面的地址设为114.114.114…

Qt篇——QTableWidget保存表格数据到Excel文件中,读Excel内容到QTableWidget

表格和excel例子如下图所示&#xff1a; 一、QTableWidget保存表格数据到Excel文件中 代码如下&#xff1a; &#xff08;pro文件中添加QT axcontainer&#xff09; #include <QAxObject>void MainWindow::saveTableToExcel() {QDateTime current_date_time QDateTi…

交友社交软件开发-php交友聊天系统-

为了开发一个高效的交友系统&#xff0c;需要一个完善的信息管理和筛选机制。这个系统应该能够根据用户的个人信息、兴趣爱好、价值观等标准进行筛选&#xff0c;并向用户提供符合他们要求心仪的人的信息。为了实现这个目标&#xff0c;系统可以利用人工智能技术&#xff0c;分…

经销商文件分发 怎样兼顾安全和效率?

经销商文件分发是指将文件、资料、产品信息等从制造商或经销商传递给经销商的过程。这一过程对于确保经销商能够获取最新的产品信息、销售策略、市场活动资料等至关重要。 想要管理众多经销商合作伙伴之间的文件传输并提高效率&#xff0c;可以采取以下措施&#xff1a; 1、建…

中文文本分类(pytorch 实现)

import torch import torch.nn as nn import torchvision from torchvision import transforms, datasets import os, PIL, pathlib, warningswarnings.filterwarnings("ignore") # 忽略警告信息# win10系统 device torch.device("cuda" if torch.cuda.i…

【yolov8部署实战】VS2019环境下使用Onnxruntime环境部署yolo项目|含源码

一、前言 部署yolo项目&#xff0c;是我这几个月以来做的事情&#xff0c;最近打算把这几个月试过的方法&#xff0c;踩过的坑&#xff0c;以博客的形式&#xff0c;分享一下。关于下面动态中讲到的如何用opencv部署&#xff0c;我在上一篇博客中已经详细讲到了&#xff1a;【…

JavaWeb 自己给服务器安装SQL Server数据库遇到的坑

之前买的虚拟主机免费送了一个SQL Server数据库&#xff0c;由于服务器提供商今年下架我用的那款虚拟主机产品&#xff0c;所以数据库也被收回了。我买了阿里云云服务器&#xff0c;但是没有数据库&#xff0c;于是自己装了一个SQL Server数据库&#xff0c;总结一下遇到的坑。…

el-input组件当数据为空时, 边框变红,并提示错误信息

1&#xff0c;样式 初始&#xff1a; 当不输入口令&#xff0c; 点击确定时&#xff1a; 2, 思路 主要是使用动态类的方式。 先设置输入框变红的样式以及提示文字的样式class 对于样式class 用变量来控制是否奏效。 3&#xff0c; 代码实现 //html&#xff1a; <div cl…

【leetcode】 剑指 Offer学习计划(java版本含注释)(下)

目录 前言第十六天&#xff08;排序&#xff09;剑指 Offer 45. 把数组排成最小的数&#xff08;中等&#xff09;剑指 Offer 61. 扑克牌中的顺子&#xff08;简单&#xff09; 第十七天&#xff08;排序&#xff09;剑指 Offer 40. 最小的k个数&#xff08;简单&#xff09; 第…

NCDA设计大赛获奖作品剖析:UI设计如何脱颖而出?

第十二届大赛简介 - 未来设计师全国高校数字艺术设计大赛&#xff08;NCDA&#xff09;开始啦&#xff01;视觉传达设计命题之一: ui 设计&#xff0c;你想知道的都在这里。为了让大家更好的参加这次比赛&#xff0c;本文特别为大家整理了以往NCDA大赛 UI 设计的优秀获奖作品&a…

QoS简单配置案例

1、两边两个方向做相同的配置&#xff1a;入口复杂流分类用mqc方式配置&#xff0c;ds内设备入口配简单流分类。 2、两边两个方法做拥塞管理配置&#xff0c;拥塞管理配置思路&#xff1a; 拥塞管理的两种配置方法&#xff08;全部用一种也可以&#xff0c;这里学习就用了两种…

算法修炼-动态规划之路径问题(1)

62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;选定一个网格为终点&#xff0c;走到这个网格的所有走法就是这个网格的上面一个网格的所有走法加上这个网格左边一个网格的所有走法&#xff0c;然后做好初始化工作就行。 class Solution { public:int…

Linux线程池

前言 线程池是一种管理线程的机制&#xff0c;它可以在需要时自动创建和销毁线程&#xff0c;以及分配和回收线程资源。线程池的主要优点是减少了频繁创建和销毁线程所带来的开销&#xff0c;提高了系统的稳定性和可扩展性。此外&#xff0c;线程池还可以有效地控制线程的数量&…

贝叶斯优化CNN分类(matlab代码)

贝叶斯优化CNN分类matlab代码 数据为Excel分类数据集数据。 数据集划分为训练集、验证集、测试集&#xff0c;比例为8:1:1 数据处理: 在数据加载后&#xff0c;对数据进行了划分&#xff0c;包括训练集、验证集和测试集&#xff0c;这有助于评估模型的泛化能力。 数据标准化…

美梦从舒适开始,康姿百德床垫为睡眠健康护航

在当今社会&#xff0c;高质量的睡眠已成为人们对生活品质的追求&#xff0c;对床垫的选择也变得越来越讲究。在我们繁忙的生活中&#xff0c;一张优质的床垫不仅是我们舒适休息的保障&#xff0c;更是保持健康生活方式的重要部分。康姿百德床垫&#xff0c;作为市场上的佼佼者…

gpt批量原创文章生成器,不限制内容的生成器

在当今的数字化时代&#xff0c;内容创作是网站持续发展的重要组成部分。然而&#xff0c;对于拥有大量内容需求的网站来说&#xff0c;手动创作文章可能会耗费大量时间和精力。为了解决这一问题&#xff0c;许多GPT&#xff08;生成式预训练模型&#xff09;文章生成软件应运而…

瑞_Redis_Redis命令

文章目录 1 Redis命令Redis数据结构Redis 的 key 的层级结构1.0 Redis通用命令1.0.1 KEYS1.0.2 DEL1.0.3 EXISTS1.0.4 EXPIRE1.0.5 TTL 1.1 String类型1.1.0 String类型的常见命令1.1.1 SET 和 GET1.1.2 MSET 和 MGET1.1.3 INCR和INCRBY和DECY1.1.4 SETNX1.1.5 SETEX 1.2 Hash类…

python封装,继承,复写详解

目录 1.封装 2.继承 复写和使用父类成员 1.封装 class phone:__voltage 0.5def __keepsinglecore(self):print("单核运行")def callby5g(self):if self.__voltage > 1:print("5g通话开启")else:self.__keepsinglecore()print("不能开启5g通…