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 {
                // >= x
                if(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 here
        if(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.mfbz.cn/a/455956.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MADQN:多代理合作强化学习

处理单一任务是强化学习的基础&#xff0c;它的目标是在不确定的环境中采取最佳行动&#xff0c;产生相对于任务的最大长期回报。但是在多代理强化学习中&#xff0c;因为存在多个代理&#xff0c;所以代理之间的关系可以是合作的&#xff0c;也可以是对抗&#xff0c;或者两者…

java组合模式揭秘:如何构建可扩展的树形结构

组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将对象组合成树形结构以表示整体/部分层次结构。组合模式使得客户端可以统一对待单个对象和组合对象&#xff0c;从而使得客户端可以处理更复杂的结构。 组合模式的主要组成部分包括&…

C#构造函数

C#中的构造函数是一种特殊的方法&#xff0c;用于创建和初始化类的对象。构造函数的名称与类的名称相同&#xff0c;并且没有返回类型。 在C#中&#xff0c;构造函数有以下几种类型&#xff1a; 默认构造函数&#xff1a;如果在类中没有定义构造函数&#xff0c;系统将自动提供…

基于java+springboot+vue实现的小区物业管理系统(文末源码+Lw+ppt)23-34

摘 要 随着互联网时代的发展&#xff0c;传统的线下管理技术已无法高效、便捷的管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;在人们生活环境要求不断提高的前提下&#xff0c;小区物业管理系统建设也逐渐进入了…

2001-2022年上市公司数字化转型程度指数测算数据(含原始数据+测算代码+计算结果)(无形资产衡量)

2001-2022年上市公司数字化转型程度指数测算数据&#xff08;含原始数据测算代码计算结果&#xff09; 1、时间&#xff1a;2001-2022年 2、指标&#xff1a;证券代码、证券简称、统计截止日期、是否发生ST或*ST或PT、、是否发生暂停上市、行业代码、行业名称、stkcd、year、…

【Python】成功解决NameError: name ‘plt‘ is not defined

【Python】成功解决NameError: name ‘plt’ is not defined &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您…

【PHP安全】PHP伪协议

PHP伪协议&#xff1a; file:// #访问本地文件系统http:// #访问HTTPs网址ftp:// #访问ftp URLphp:// #访问输入输出流zlib:// #压缩流data:// #数据&#xff08;RFC 2397&#xff09;ssh2:// #security shell2expect:// #处理交互式的流glob:// #查找匹配的文件路径phar:// #P…

【MySQL性能优化】- 一文了解MVCC机制

MySQL理解MVCC &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff…

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

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

5.Python从入门到精通—Python 运算符

5.Python从入门到精通—Python 运算符 Python 运算符算术运算符比较&#xff08;关系&#xff09;运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符运算符优先级 Python 运算符 Python语言支持以下类型的运算符: 算术运算符比较&#xff08;关系&#xff09;运算符赋…

基于YOLOv5的火灾检测系统

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:详细介绍了火灾检测整个过程&#xff0c;从数据集到训练模型到结果可视化分析。 博主简介 AI小怪兽&#xff0c;YOLO骨灰级玩家&#xff0c;1&#xff09;YOLOv5、v7、v8优化创新&#xff0c;轻松涨点和模型轻量化&#…

CSS 03

1.选择器 1.1 结构伪类选择器 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>结…

Facebook:连接世界的社交巨人

在当今数字化时代&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;扮演着连接世界的重要角色。它不仅仅是一个社交网站&#xff0c;更是一个数字化的社交生态系统&#xff0c;影响着全球数十亿用户的生活和交流方式。本文将深入探讨Facebook的起源、用户规模和…

MYSQL 是如何保证binlog 和redo log同时提交的?

MYSQL 一个事务在提交的时候能够保证binlog和redo log是同时提交的&#xff0c;并且能在宕机恢复后保持binlog 和redo log的一致性。 先来看看什么是redo log 和binlog&#xff0c;以及为什么要保持它们的一致性。 什么是redo log&#xff0c;binlog redo log是innodb引擎层…

如何使用“Docker registry创建本地仓库,在服务器之间进行文件push和pull”?

1.1、在服务器1&#xff0c;运行registry docker run -d -p 5000:5000 -v ${PWD}/registry:/var/lib/registry --restart always --name registry registry:2.7.11.2、编辑/etc/docker/daemon.json 文件&#xff0c; 192.168.xxx.xxx 换成你自己 registry 服务的地址 sudo na…

可视化Relay IR

目标 为Relay IR生成图片形式的计算图。 实现方式 使用RelayVisualizer可视化Relay&#xff0c;RelayVisualizer定义了一组接口&#xff08;包括渲染器、解析器&#xff09;将IRModule可视化为节点和边&#xff0c;并且提供了默认解析器和渲染器。 首先需要安装依赖&#x…

python工具方法 47 基于paddleseg将目标检测数据升级为语义分割数据

在进行项目研究时,通常需要搜集开源数据集。但是所能搜集到的数据集通常会存在形式上的差异,比如我想要的是语义分割数据,而搜集到的数据集却是目标检测数据;在这种情况下所搜集的数据就完成没有利用价值了么?不,其还存在价值,我们可以通过模型训练对数据标签的标注粒度…

网站首页添加JS弹屏公告窗口教程

很多小白站长会遇到想给自己的网站添加一个弹屏公告&#xff0c;用于做活动说明、演示站提示等作用与目的。 下面直接上代码&#xff1a;&#xff08;直接复制到网页头部、底部php、HTML文件中&#xff09; <script src"https://www.mohuda.com/site/js/sweetalert.m…

【微服务-Nacos】Nacos集群的工作原理及集群间数据同步过程

上篇文章我们介绍了Nacos集群的搭建方法及步骤&#xff0c;下面我们来看一下Nacos集群的工作原理&#xff0c;一共有两部分&#xff1a;Leader节点选举及各节点数据同步。 1、Nacos集群中Leader节点是如何产生的 Nacos集群采用了Raft算法实现。它是一种比较简单的选举算法&am…

编程四十载 - 总结了 13 条建议

原文&#xff1a;Theo Leggett - 2024.03.12 引言 10 PRINT "HELLO" 20 GOTO 10&#xff08;注&#xff1a;这段代码是 BASIC 语言&#xff0c;无限循环打印 “HELLO”&#xff09; 1984 年的 4 月&#xff0c;我的父亲为自己的家庭办公室&#xff0c;购买了一台电…