JAVA初阶数据结构(链表)练习(这些可以作为java包中的方法)

这里的每一个题大家都要仔细完成,这些题目每个我都至少思考了两个小时左右(沉重心,慢慢来)

1.反向链表的实现(对链表进行翻转)(力扣有)

(1)图示

(2)思路

遍历整个数组不断的进行头插法就可以从正向变为反向数组

(3)代码实现

前面两个指的是链表为空和只有一个元素的情况

有一个细节就是display的方法永远从头结点开始,头节点改变了也一样 

如果想从指定位置打印可以传入参数然后让头结点等于参数就可以在指定位置往后进行打印了

2.找出链表的中间节点

. - 力扣(LeetCode)

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

(1)第一种方法就是遍历整个链表然后定义一个计数器,每次遍历一个节点就计数器加一,之后计数器的值除2就可以了(太过简单不建议面试的时候使用这种方法太简单)

(2)第二种方法是定义3个节点,其中个节点分别为cur slow fast这三个节点的初始都是标记头节点的。然后fast节点和slow节点分别遍历整个节点,遍历到最后slow代表的节点就是中间节点,不相信可以自己带入我上面画出的节点进行遍历验证。

(3)第二种的方法实现

我们要注意的一点就是,while中的循环条件&&的左右不能替换,因为一但替换的化会发生空指针异常,万一一开始就是空的节点,然后它指向下一个就会发生异常

3.输入一个链表然后输出它的倒数第k个节点(力扣上面搜)

 遍历整个链表,然后定义计数器来判断有多少个节点 ,定义三个节点分别为cur slow fast ,其中fast先走k-1步,然后slow和fast一起走到fast走到空为止,这时候slow走到的位置就是倒数第k个位置,大家可以带入链表实验一下

先搞一个大致的框架然后再对框架的细节进行弥补

万一没走完k-1步那么就会发生空指针异常所以为了防止这种情况的发生我们需要对k进行判断

再while中进行判断k的值在每次循环之后是否都是合法的

4.将两个有序链表合并成一个有序链表(力扣上面进行搜索)

图示

 先定义一个虚拟节点,然后节点进行串联,然后每当下一个就和另外一个节点进行比较来继续穿,最后返回头结点就可以遍历整个链表搞好排序了

5.以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 。(力扣上面搜)

给一个x,x的值等于30,那么链表的左边是比30小右边比30要大,

题目稍微修改一下

现有一链表的头指针ListNode*pHead,给一定值x,编写一段代码将小于x的节点排在其余节点之前,且不能改变原来数据的顺序,返回重新排序后的链表的头指针。

(1)定义两个不同的分别为bs 和be这两个是指的比x小的数字,第二个是as和ae这两个是指比x大的数字,到后面直接把这两个链表给结合一下就可以了,然后要保证顺序没有变化就需要进行尾插法,最后返回新的节点的头节点就行了

(2)先定义一个cur然后遍历整个链表,小于放入bs中,大于放入as中,(用)

 第一次插入的时候bs和be(同理)是指向同一个的,然后再放入一个就变成be了,接下来插入的节点就全部插入be的后面了(as ae同理),最后让be的next等于as就可以了,

代码实现(总代码)

 public ListNode partition(int x) {// write code here//定义一个cur 指向链表的头节点ListNode cur = head;ListNode bs = null;ListNode be = null;ListNode as = null;ListNode ae = null;//使用cur来遍历 所有的节点while (cur != null) {if(cur.val < x) {if(bs == null) {bs = cur;be = cur;}else {be.next = cur;be = be.next;}}else {// >= xif(as == null) {as = cur;ae = cur;}else {ae.next = cur;ae = ae.next;}}cur = cur.next;}if(bs == null) {return as;}be.next = as;if(as != null) {ae.next = null;}return bs;}

如果没有小于x的就会发生空指针异常,所以如果bs不等于空那么就让be.next =as 然后返回bs

这样虽然解决了一个段有一个段没有的问题,但是还有一种情况就是,不知道什么时候结束

大家再遍历一个链表结束的时候是next的值为null的时候结束

但是这段代码结束的时候ae没有为空,那么客户端就会不知道啥时候结束,所以as如果as不等于空那么ae的next就是null的我们手动把ae的next清空并不会影响排序和34这个值。 

6.链表的回文结构 链表的回文结构_牛客题霸_牛客网1:00:00

回文可以理解为链表的结构是对称的,也就是数据是对称的,12,23,23,12这就是一个回文结构还有12,23,24,23,12

所以先定义两个指针来标记链表的尾部和头部

找到中间节点,先定义一个fast再定义一个slow,fast走两步slow走一步,fast走到null的时候结束循环

把中间节点后面给反转过来如果相同就是回文节点

奇数

(1)将后面一段进行反转

中间节点为slow slow的下一个节点为cur    fast节点为curNext   

slow往后面走,cur等于slow   ,curNext往后面走发现为空了这时候cur等于slow这时候就将这个链表给反转完成了,这时候cur再往后面走走到空 fast和slow一个位置

(2)fast不走

(3)这时候两边同时往中间走然后判断相同不相同直接return false

偶数情况差不多

(1)奇数的话slow和fast不会相遇

代码实现

public boolean chkPalindrome() {// write code hereif(head == null) {return true;}//1. 找中间节点ListNode fast = head;ListNode slow = head;while (fast != null && fast.next != null) {fast = fast.next.next;slow = slow.next;}//2.翻转ListNode cur = slow.next;while (cur != null) {ListNode curNext = cur.next;cur.next = slow;slow = cur;cur = curNext;}//3.一个往前 一个往后while (slow != head) {if(slow.val != head.val) {return false;}//偶数情况if(head.next == slow) {return true;}head = head.next;slow = slow.next;}return true;}public boolean hasCycle() {ListNode fast = head;ListNode slow = head;while(fast != null && fast.next != null) {fast = fast.next.next;slow = slow.next;if(fast == slow) {return true;}}return false;}

7.给你两个链表看你的两个链表是不是相交的?力扣上面自己搜

是一个y字形状

这样就相交了(相交的交点的地址是一样的)

下图两种情况都是可以的

 headA 和headB同?时走如果相遇了就是我们相交的交点,其中有一个问题?谁规定的在这这两个岔开的两个链表的节点数字是一样的,你不知道节点数有啥办法解决?

首先我们要知道的一点就是,这两个节点再相交点之后的节点是一样的所以,我们只需要将两个节点相减就可以发现哪个节点比哪个节点大!

所以

(1)求长度

(2)走插值步,相遇之后就是相交的点节点

代码实现

(1)两个链表为空要进行判断

(2)定义pl永远指向最长的链表 ps指向最短的链表

(3)len用来记录差值

 (4)如果差值为复数那么pl和ps交换位置再用len记录

(5)这样就能包装p1指向最长ps指向最短,len一定时正数

(6)循环不解释了自己看自己解读(第一个循环包装p1和ps走向相遇节点的旅程时一样的,之后,一人一步走)

(7)第二个循环一人一步走

(8)最后return一个pl就可以了

(9)其中有一个漏洞就是:如果节点为空的话也时可以通过的因为空也是相同的,所以我们要对都是null的进行判断

大(0)是m+n = n

(10)下面代码是官方的解答

8.判断链表是非有环(最后一个节点和第一个节点或者其他节点来进行连接)

链表是跳着走的

一圈以后他们就相遇了

(1)对于一步两步的情况,我们可以发现,他们的距离差(也就是环的周长)是一个定值,而且这个定值是2的倍数。一个人每次走一步,另一个人每次走两步,就相当于他们以相同的方向在环上移动,且速度不同。这样当他们相遇时,他们的距离差必须是2的倍数,所以他们必须在某个点相遇。

(2)但是对于两步三步的情况,他们的距离差并不是一个定值。一个人每次走两步,另一个人每次走三步,就相当于他们以相同的方向在环上移动,但速度不同。如果他们的速度比较相似,那么他们有可能在某个点相遇,但如果速度相差太大,他们就很难相遇。因为他们在相差太大的情况下,它们将不再以相同的方向移动。有时他们之间的差距会变得比开始时更大,有时会变得更小,但总是无法保证他们是否会在某个点相遇。

所以,一个人每次走一步,另一个人每次走两步的情况是一种比较特殊的情况,而两步三步的情况却具有更大的不确定性。

证明:

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

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

相关文章

2024考研国家线公布,各科分数线有哪些变化?考研国家线哪些涨了,哪些跌了?可视化分析告诉你

结论在文章结尾 2024考研国家线 一、近五年国家线趋势图-学术硕士 文学 管理学 工学照顾专业 体育学 交叉学科 军事学 历史学 理学 享受少数名族照顾政策的考生 中医类照顾专业 教育类 艺术类 医学 工学 哲学 法学 农学 经济学 二、近五年国家线趋势图-专业硕士 中医 应用心理 …

web项目的搭建

使用Webstorm并创建Next.js文件 1、配置nodejs环境、安装webstorm【配置node.js可以使用nvm去管理nodejs的版本】 2、需要破解webstorm&#xff0c;可能会导致原本的idea失效&#xff0c;注册码过期 3、taobao的npm过期&#xff0c;导致npm is sass执行不成功&#xff0c;需…

jvaweb 3-13

Element 后端开发 maven maven的作用 下载并配置环境变量 创建Maven项目 Maven坐标 依赖 Maven的依赖传递特性 以图表形式展示依赖 排除依赖 依赖范围 生命周期

普通小白现在做抖音小店还能赚到钱吗?千万不要忽视这几点

大家好&#xff0c;我是电商花花。 赚钱做生意的秘密&#xff0c; 很简单&#xff0c;就是积少成多&#xff0c;以小见大&#xff0c;然后和时间成为朋友。 而做抖音小店也是这样的一个道理&#xff0c;不管是新手小白还是老电商玩家&#xff0c;都是从一点一滴做起来的&…

如何使用vue定义组件之——父组件调用子组件

首先&#xff0c;我们需要创建两个组件模板template&#xff1a; <template id"father"><div><h3>我是父组件</h3><h3>访问自己的数据:</h3><h3>{{ msg }}</h3></div></template><template id"…

性能测试-数据库

一、数据库事务机制 ACID描述 1、原子性Atomicity&#xff1a;事务通常由多个语句组成。原子性保证将每个事务视为一个“单元”&#xff0c;该事务要么完全成功&#xff0c;要么完全失败 2、一致性Consistency&#xff1a;“一致”是指数据库中的数据是正确的&#xff0c;不存…

【2024-03-12】设计模式之模板模式的理解

实际应用场景&#xff1a;制作月饼 过程描述&#xff1a; 一开始&#xff0c;由人工制作月饼&#xff0c; 第一个&#xff1a;根据脑子里面月饼的形状&#xff0c;先涅出月饼的形状&#xff0c;然后放入面粉和馅料把开口合并起来。 第二个&#xff1a;根据脑子里面月饼的形状&…

BigDL-LLM 安装指南——在iGPU集成显卡下使用BigDL-LLM大模型库加速LLM

文章目录 iGPU是什么&#xff1f;一、环境准备1.1 Visual Studio 2022 Community 安装1.2 安装或更新最新版本的GPU驱动程序1.3 安装英特尔oneAPI工具包2024.0版本1.4 安装Anaconda 二、BigDL -LLM 安装2.1 创建虚拟环境2.2 激活虚拟环境2.3 安装bigdl-llm[xpu] 三、运行环境配…

iOS 17.4 Not Installed

iOS15以后&#xff0c;下载了xcode安装好后&#xff0c;并不会自动下载好模拟器&#xff0c;需要手动下载。 有两种下载方式 xcode下载 xcode -> Settings 打开面板 xcode下载虽然方便&#xff0c;但是有个问题是&#xff0c;这里下载如果断网了不会断点续传&#xff0c;…

MyBatis 框架之一:简介及环境搭建详细步骤

1. MyBatis 是什么&#xff1f; MyBatis 是一个流行的、轻量级的 Java 持久层框架&#xff0c;它简化了与数据库交互和 SQL 映射的过程。MyBatis 取代了 JDBC 原始 API 的大量繁琐工作&#xff0c;允许开发者将更多的精力放在业务逻辑上而不是处理数据访问细节。 mybatis 是一款…

激光雷达研究笔记1:资料整理与学习_windows机对其评估使用

到手了一款型号为LDROBOT LiDAR LD19 的单线激光雷达模块&#xff0c;现对其进行学习使用&#xff1a; 1.对产品手册的研究&#xff1a; 通读产品手册后&#xff0c;我提炼了几方面有用的信息&#xff1a; 1.测量依据&#xff1a; 以下是激光雷达点云扫描示意图&#xff1a; 上…

Linux信号机制(二)

目录 一、信号的阻塞 二、信号集操作函数 三、sigprocmask函数 四、pause函数 五、sigsuspend函数 一、信号的阻塞 有时候不希望在接到信号时就立即停止当前执行&#xff0c;去处理信号&#xff0c;同时也不希望忽略该信号&#xff0c;而是延时一段时间去调用信号处理函数。…

【Sql Server】通过Sql语句批量处理数据,使用变量且遍历数据进行逻辑处理

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

Qt配置OpenCV,无需编译

网上很多关于Qt配置OpenCV的教程都需要下载CMake编译Opencv&#xff0c;但是这种做法出错的概率很大&#xff0c;很多时候会受CMake或者Opencv版本的影响&#xff0c;又或者是没有使用Qt自带的Cmake-gui.exe程序&#xff0c;我在编译的时候也是频繁出错。 本文推荐的方法是使用…

【EDK II】作为UEFI的实现,EDK II 的架构是什么样的

目录 前言 EDK II 架构 配置文件 结语 前言 基本输入输出系统 (Basic Input Output System, BIOS) 最早由 IBM&#xff08;International Business Machines Corporation) 公司于1981年提出并开发&#xff0c;后来成为个人计算机(PC)的标准固件接口。但受限于传统BIOS (Le…

MySQL的用户管理以及权限设置

用户管理 账户管理 我们在数据库里面创建用户&#xff0c;修改用户&#xff0c;删除用户&#xff0c;本质上就是对mysql数据库下的user表进行增删查改&#xff0c;用户的所有信息都存在这张表里&#xff0c;我们想要创建用户可以往user表insert&#xff0c;删除用户可以delet…

【Java基础概述-10】IO流、字节流、字符流、缓冲流、转换流、序列化、打印流、Properties属性集对象

目录 1、IO流概述 2、字节流的使用 2.1、FileInputStream字节输入流 2.1.1、读取方式一 2.1.2、读取方式二 2.1.3、字节流读取数据如何避免中文乱码 2.2、OutputStream字节输出流 2.3、案例&#xff1a;复制粘贴小案例 3、字符流 3.1、FileReader字符输入流 3.1.1、读…

打卡学习kubernetes——kubernetes架构原理

接上一篇的内容&#xff0c;除了核心组件&#xff0c;还有一些推荐的Add-ons&#xff1a; kube-dns 负责为整个集群提供DNS服务Ingress Controller 为服务提供外网入口Heapster 提供资源监控&#xff08;没用过这个&#xff0c;但是用过grafana&#xff0c;很方便&#xf…

MySQL的事务隔离是如何实现的?

目录 从一个例子说起 快照读和当前读 事务的启动时机和读视图生成的时刻 MVCC 隐藏字段 Undo Log回滚日志 Read View - 读视图 可重复读(RC)隔离级别下的MVCC 读提交(RR)隔离级别下的MCC 关于MVCC的一些疑问 1.为什么需要 MVCC &#xff1f;如果没有 MVCC 会怎样&am…

ov多域名SSL数字证书1200元一年送一月

随着互联网的发展&#xff0c;不论是个人用户还是企事业单位都不止有一个网站&#xff0c;为了保护网站安全&#xff0c;就需要为网站安装SSL证书&#xff0c;而SSL证书中的通配符SSL证书和多域名SSL证书都可以同时保护多个域名站点。其中&#xff0c;多域名SSL证书可以同时保护…