链表面试练习习题(Java)

1.

思路:

创建两个链表,一个用来记录小于x的结点,一个用来记录大于等于x的结点,然后遍历完原链表后,将小于x的链表和大于等于x的链表进行拼接即可

public class Partition {  public ListNode partition(ListNode pHead, int x) {  if (pHead == null || pHead.next == null) {  //如果链表为空或者只有一个结点return pHead;  }  ListNode beforeHead = new ListNode(0); // 哑节点,用于小于x的链表  ListNode before = beforeHead;  ListNode afterHead = new ListNode(0); // 哑节点,用于大于等于x的链表  ListNode after = afterHead;  while (pHead != null) {  if (pHead.val < x) {  before.next = pHead;  before = before.next;  } else {  after.next = pHead;  after = after.next;  }  pHead = pHead.next;  }  // 断开大于等于x的链表的尾部  after.next = null;  // 将小于x的链表连接到大于等于x的链表之前  before.next = afterHead.next;  return beforeHead.next;  }  
}

2.

思路:

首先要判断回文,必须要先找到中间结点,然后以中间结点为分界线,进行左右两部分判断,所以可以采用快慢指针找中间结点

因为是单向链表,右边这一部分很难从后往前走判断是否回文,所以我们要解决这个问题,可以想到的办法就是反转链表,将后面的结点的next指向它的前一个结点,相当于将中间结点后面的单向链表变成双向链表,同时慢指针走到最后一个结点

最后头结点往后走,慢指针往前走(只能用慢指针,因为当结点个数为偶数时,快指针会指向null)进行判断是否回文

public class PalindromeList {public boolean chkPalindrome(ListNode A) {// write code here//第一步:找到中间结点ListNode slow = A;ListNode fast = A;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;}//第二步:反转中间结点后面的链表ListNode cur = slow.next;ListNode curN = cur.next;while (cur != null) {curN = cur.next;cur.next = slow;slow = cur;cur = curN;}//第三步:判读回文while (slow != A) {//当还没有相遇时if(A.next==slow&&A.val==slow.val){//偶数个结点回文判断结束条件return true;}if (slow.val != A.val) {//不是回文return false;}else{//继续判断slow=slow.next;A=A.next;}}return true;//奇数个结点回文判断结束条件}
}

3.

思路:

法一:一个链表作为参照,一个链表用来遍历,如果参照链表的这个结点经过另外那个链表遍历后没有发现相交,参照链表的结点往后,另外那个链表继续遍历,如此类推

法二:如果相交,那么相交之后的链表长度是相同的,所以两个链表长度的差值就等于相交前面的链表长度差值,因此只需要求出两个链表的长度,相减得出差值,让较长的链表先走差值步,然后再以相同的速度往后走,则相等时相交

代码(法一):

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode a=headA;ListNode b=headB;while(a!=null){//每次遍历一个a链表的结点while(b!=null){//遍历全部b链表的结点if(b==a){//如果相交return b;}else{b=b.next;//继续找}}b=headB;//从头开始a=a.next;//找下一个结点}return null;//没有相交}
}

代码(法二):

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode a=headA;ListNode b=headB;int len1=0;//a链表的长度int len2=0;//b链表的长度int len=0;//差值while(a!=null){//求a链表的长度len1++;a=a.next;}while(b!=null){//求b链表的长度len2++;b=b.next;}if(len1>len2){//如果是a链表更长len=len1-len2;a=headA;//a指向更长的那条链表b=headB;//b指向更短的那条链表}else{//如果是b链表更长len=len2-len1;a=headB;//a指向更长的那条链表b=headA;//b指向更短的那条链表}while(len!=0){//让长链表先走差值步len--;a=a.next;}while(a!=b){//如果还没有相交a=a.next;b=b.next;}if(a==null){//没有相交return null;}return a;//相交点}
}

4.

思路:

如果没有环的话,那么一定会有一个尽头,即一定会走到null,如果有环的话,那么将永远没有尽头,即不存在null,这个环可以看作是一个圆形操场,就变为简单的追及相遇这个数学问题,所以需要快慢指针,如果有环,那么快指针一定和慢指针相遇

public class Solution {public boolean hasCycle(ListNode head) {if(head==null){//如果是空链表return false;}ListNode slow=head;ListNode fast=head;while(fast!=null&&fast.next!=null){//如果走到了尽头slow=slow.next;fast=fast.next.next;if(slow==fast){//如果相遇,说明有环break;}}if(fast==null||fast.next==null){//如果是因为走到尽头而跳出的循环return false;//没有环}return true;//如果是因为相遇而跳出的循环,则有环}
}

5.

思路:

首先判断是否有环,跟上面一题一样,接下来,如果有环,求出环的开始结点,还是快慢指针,快指针一次走两步,慢指针一次走一步,用两个公式表示快慢指针走的路程,其中C是环的长度,K是相遇点距离环的开始结点的长度,X表示头结点到环的开始结点的长度

1.fast走的路程S1:X+NC+C-K

2.slow走的路程S2:X+C-K

并且S1=2S2

所以

X+NC+C-K=2*(X+C-K)

X+NC+C-K=2X+2C-2K

X=(N-1)C+K

由该公式可得,从头结点到环的开始结点等于从相遇点走N-1圈再走到环的开始结点,所以让slow从头结点开始,fast从相遇点开始,以相同的速度开始走,那么再次相遇的位置就是环的开始结点

public class Solution {public ListNode detectCycle(ListNode head) {if(head==null){//如果是空链表return null;}ListNode slow=head;ListNode fast=head;while(fast!=null&&fast.next!=null){//走到尽头slow=slow.next;fast=fast.next.next;if(slow==fast){//如果相遇break;}}if(fast==null||fast.next==null){//如果是因为走到尽头,则无环return null;}//因为相遇,则有环slow=head;//从头走到环的开始结点while(slow!=fast){//走到相遇slow=slow.next;fast=fast.next;}return slow;//返回相遇点(即环的开始结点)}
}

6.

思路:

首先先判断特殊情况:两个链表都为空,或者其中一个链表为空,则返回null

然后是正常情况,因为两个链表都是升序的,所以先比较两个链表的头结点,较小的那个结点则一定为两个链表中最小的,所以该结点为合并后新的头结点,然后用一个指针cur去接收两个链表较小的结点,尾插在新的头结点后面,如此类推

class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode newH=null;//合并后的头结点if(list1==null&&list2==null){//两个链表都为空return null;}if(list1==null){//其中一个链表为空return list2;}if(list2==null){//另外一个链表为空return list1;}ListNode a=list1;ListNode b=list2;if(a.val<b.val){newH=a;//说明合并后的新头结点为a链表的头结点a=a.next;}else{newH=b;//说明合并后的新头结点为b链表的头结点b=b.next;}ListNode cur=newH;//用来遍历链表while(a!=null&&b!=null){//当两个链表都没有走完if(a.val<b.val){//a的小于b,则插acur.next=a;cur=cur.next;a=a.next;}else{//a的大于等于b,则插bcur.next=b;cur=cur.next;b=b.next;}}while(a!=null){//当b链表走完而a链表没有走完,将a链表全部尾插cur.next=a;cur=cur.next;a=a.next;}while(b!=null){//当a链表走完而b链表没有走完,将b链表全部尾插cur.next=b;cur=cur.next;b=b.next;}return newH;//返回合并后的新头结点}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

如何将PDF转换成可以直接编辑的CAD图纸?

PDF图纸是为了让用户更好的阅览CAD文件&#xff0c;但是&#xff0c;当我们想要对其进行编辑的时候&#xff0c;PDF图纸就是一个麻烦了。那么PDF转换成CAD后可以编辑吗&#xff1f;如何将PDF转换成可以直接编辑的CAD图纸呢&#xff1f;本篇给你答案。 1、启动迅捷CAD编辑器&…

linux进行redis的安装并使用RDB进行数据迁移

现在有两台电脑&#xff0c;分别是A&#xff0c;B&#xff0c;现在我要把A电脑上的redis的数据迁移到B电脑上&#xff0c;B电脑上是没有安装redis的 1.找到A电脑的redis的版本 1.先启动A电脑的redis&#xff0c;一般来说&#xff0c;都是直接在linux的控制台输入&#xff1a;re…

Spring Cloud Loadbalancer 的使用

一、默认负载均衡策略 Spring Cloud LoadBalancer 默认的负载均衡策略是轮询。 轮询效果示例 我们需要示例一个请求分发到不同的模块上&#xff0c;所以我们需要创建多模块项目。 新建 Spring Boot &#xff08;3.0.2&#xff09;的 Maven 项目&#xff08;JDK 17&#xff09…

万界星空科技MES系统生产计划管理的功能

MES系统&#xff08;Manufacturing Execution System&#xff0c;制造执行系统&#xff09;的生产计划管理功能是其核心功能之一&#xff0c;旨在将企业的生产计划转化为实际的生产操作&#xff0c;并通过实时监控和调整来确保生产活动的顺利进行。以下是MES系统生产计划管理功…

STM32智能环境监测系统教程

目录 引言环境准备智能环境监测系统基础代码实现&#xff1a;实现智能环境监测系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;环境监测与管理问题解决方案与优化收尾与总结 1. 引言 智能环境监测系统通…

基于STM32智能电子锁设计

1.简介 随着时代的高速发展&#xff0c;家居安全也成为人们日常生活中的一个安全问题。目前传统的门锁使用的是机械密码&#xff0c;在安全性方面表现不佳。这些缺点可以通过改用智能电子密码锁来弥补。智能电子锁是一种使用了现代电子技术的高科技产品&#xff0c;它的出现解决…

ActiveMQ配置延迟投递和定时投递教程

配置activemq.xml中的<broker>标签添加schedulerSupport"true" schedulerSupport"true"更改完成重启生效 四大属性解释 Property nametypedescriptionAMQ_SCHEDULED_DELAYlong延迟投递的时间AMQ_SCHEDULED_PERIODlong重复投递的时间间隔AMQ_SCHEDU…

期权末日双买跨式策略-这才是末日轮稳定赚钱的方法吗?!

今天带你了解期权末日双买跨式策略-这才是末日轮稳定赚钱的方法吗&#xff1f;&#xff01;期权末日双买跨式策略是一种在期权到期日前预期市场会出现大幅波动时使用的策略。 期权双买跨式策略适合期权末日轮是因为它能利用临近到期日时市场潜在的大幅波动来获利。末日轮期权&…

AI数字人+数字孪生IOC智慧运营平台:提升业务场景智慧化运维水平

在人工智能时代&#xff0c;“AI数字人数字孪生IOC智慧运营平台”&#xff0c;不仅能够提升数字孪生系统的人机交互体验&#xff0c;还能实现高效的运维管理&#xff0c;可以有效推动多领域场景数字化转型和智能化升级。 案例分享 深圳新一代产业园NEXT PARK交流中心 深圳新一…

【中项第三版】系统集成项目管理工程师 | 第 5 章 软件工程① | 5.1 - 5.3

前言 第5章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于技术的内容&#xff0c;学习要以教材为准。 目录 5.1 软件工程定义 5.2 软件需求 5.2.1 需求的层次 5.2.2 质量功能部署 5.2.3 需求获取 5.2.4 需求分析 5.2.5 需求规格说明书 5.2.6 需求变…

使用C#实现无人超市管理系统——数据结构课设(代码+PPT+说明书)

说明&#xff1a;这是自己做的课程设计作业&#xff0c;得分情况98/100 如果想要获取私信我 本项目采用线性表中的链表来进行本次系统程序的设计。链表分为两条线&#xff0c;分别是存储用户信息和商品信息&#xff0c;并且都设为公共属性&#xff0c;方便对用户信息和商品信息…

C#数字医学影像系统(RIS/PACS)源码,Oracle数据库,C/S架构,运行稳定

数字医学影像系统&#xff08;RIS/PACS&#xff09;源码&#xff0c;三甲以下的医院都能满足。PACS 系统全套成品源码。 开发技术&#xff1a;C/S架构&#xff0c;C#开发语言&#xff0c;数据库服务器采用Oracle数据库。 医学影像存储与传输系统&#xff0c;融合了医学信息化…

【面试题】Golang 自动垃圾回收机制细节(第六篇)

目录 Go V1.3之前的标记清除&#xff08;mark and sweep&#xff09; Go V1.5三色标记法 Go V1.8混合写屏障机制 各版本之间的区别 Go V1.3之前的标记清除&#xff08;mark and sweep&#xff09; 流程 1.暂停程序业务逻辑&#xff0c;找出不可达的对象和可达对象 2.开始…

WebPlotDigitizer图像取点软件/在线网页

记录一下WebPlotDigitizer的使用方法。 网上一搜就能搜到官网&#xff0c;本文也把网址放在最后了。 1 上传待处理图像 2 选择图像的类型 每个选项都有示例图&#xff0c;不一一解释了。选好后点击 calibrate 3 确定横纵坐标 3.1 上一步完成后&#xff0c;左边栏会自动跳…

Elasticsearch:如何选择向量数据库?

作者&#xff1a;来自 Elastic Elastic Platform Team 向量数据库领域是一个快速发展的领域&#xff0c;它正在改变我们管理和搜索数据的方式。与传统数据库不同&#xff0c;向量数据库以向量的形式存储和管理数据。这种独特的方法可以实现更精确、更相关的搜索&#xff0c;并允…

物流智能锁在物流货运智能锁控管理中的深度应用与变革

一、物流货运锁控管理的痛点分析 &#xff08;一&#xff09;安全风险居高不下 1、传统锁具易被破解 常见的机械锁和简单电子锁结构相对简单&#xff0c;技术手段容易突破&#xff0c;给不法分子留下可乘之机&#xff0c;导致货物被盗或被篡改的风险增加。 2、缺乏实时监控…

生产车间人数统计牌,统计精准,显示内容全面

在现代制造业中&#xff0c;精细化管理和安全生产是企业持续发展的关键。随着工业4.0和智能制造的推进&#xff0c;各种智能工具和系统被广泛应用于生产管理&#xff0c;以提高效率、降低成本、保障安全。其中&#xff0c;生产车间人数统计牌作为一种重要的现场管理工具&#x…

前端小项目-强调鼠标悬停时效果的名片

前端练习小项目——动态效果名片 前言&#xff1a; 在学习完HTML和CSS之后&#xff0c;我们就可以开始做一些小项目了。本篇文章所讲的小项目为——动态效果名片。通过这个项目&#xff0c;你将学会如何使用HTML和CSS来创建一个具有动态效果的名片。 在开始学习之前&#xff0…

信任、创新和传承: 对威步创始人的深入采访

Reflecting on 35 years, what was the moment you realized your vision for the company was becoming a reality? 回顾 35 年的发展历程&#xff0c;您意识到自己对公司的愿景即将成为现实的那一刻是什么时候&#xff1f; Oliver Winzenried 我们看到市场上出现了首批数字…

什么是多源异构数据?如何处理多源异构数据?

目录 一、多源异构数据的定义 二、多源异构数据的种类 三、多源异构数据的处理方案 1.数据接入 2.数据转换 3.数据输出 4.数据同步 四、结语 随着数字化转型的深入&#xff0c;企业和社会产生了前所未有的海量数据。这些数据不仅量大&#xff0c;而且来源多样&#xff0c;结构各…