链表面试练习习题(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://xiahunao.cn/news/3248605.html

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

相关文章

【Java面向对象】抽象类和接口

文章目录 1.抽象类2.常见的抽象类2.1 Number类2.2 Calendar 和GregorianCalendar 3.接口4.常见接口4.1 Comparable 接口4.2 Cloneable 接口4.3 深浅拷贝 5.类的设计原则 1.抽象类 在继承的层次结构中&#xff0c;每个新的子类都使类变得更加明确和具体。如果从一个子类向父类追…

IDEA中创建一个SpringBoot项目并提交到git仓库(日常开发-保姆级手把手超详细截图)

日常开发 第一步&#xff1a; 第二步&#xff1a; &#x1f388;边走、边悟&#x1f388;迟早会好 Git是什么&#xff1f; Git是一款免费、开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。 Git是一个开源的分布式版本控制系统&#xff0c;可…

【保卫花果山】游戏

游戏介绍 拯救花果山是一款玩家能够进行趣味闯关的休闲类游戏。拯救花果山中玩家需要保护花果山的猴子&#xff0c;利用各种道具来防御妖魔鬼怪的入侵&#xff0c;游戏中玩家需要面对的场景非常的多样&#xff0c;要找到各种应对敌人的方法。拯救花果山里玩家可以不断的进行闯…

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-20 读写I2C接口的RTC时钟芯片

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

超声波清洗机选哪款比较好?推荐四款性价比超高型号

2024年的超声波清洗机技术已经取得了显著进步。市面上的超声波清洗机种类繁多&#xff0c;功能各异&#xff0c;有的可以彻底清洁眼镜&#xff0c;有的还能进行消毒等。今天&#xff0c;我向大家推荐几款我亲自测试过的超声波清洗机&#xff0c;它们的性能都相当优秀&#xff0…

分布式搜索引擎ES-elasticsearch入门

1.分布式搜索引擎&#xff1a;luceneVS Solr VS Elasticsearch 什么是分布式搜索引擎 搜索引擎&#xff1a;数据源&#xff1a;数据库或者爬虫资源 分布式存储与搜索&#xff1a;多个节点组成的服务&#xff0c;提高扩展性(扩展成集群) 使用搜索引擎为搜索提供服务。可以从海量…

Android获取当前屏幕显示的是哪个activity

在 Android 中&#xff0c;要获取当前屏幕显示的 Activity&#xff0c;可以使用以下几种方法&#xff1a; 方法一&#xff1a;使用 ActivityManager 获取当前运行的任务信息 这是一个常见的方法&#xff0c;尽管从 Android 5.0 (API 21) 开始&#xff0c;有些方法变得不太可靠…

Java语言程序设计——篇五(2)

有关数组的方法 &#x1f4a5;增强的for循环实战演练 数组元素的复制实战演练 数组参数与返回值&#x1f4a2;java.util.Arrays类数组的排序实战演练 元素的查找数组元素的复制填充数组元素数组的比较实战演练 &#x1f4a5;增强的for循环 增强的for循环&#xff0c;它是Java …

MySQL(6)内置函数,复合查询.

目录 1.内置函数; 2.复合查询; 1.内置函数: 1.1 日期函数: 时分秒: 时间戳: 基本日期上加日期: 基本日期减去日期: 日期相差天数: &#x1f330; 创建一张表&#xff0c;记录生日: 创建一个留言表: 显示所有留言信息&#xff0c;发布日期只显示日期&#xff0c;不用显示时间: …

tree组件实现折叠与展开功能(方式1 - expandedTree计算属性)

本示例节选自vue3最新开源组件实战教程大纲&#xff08;持续更新中&#xff09;的tree组件开发部分。考察响应式对象列表封装和computed计算属性的使用&#xff0c;以及数组reduce方法实现结构化树拍平处理的核心逻辑。 实现思路 第一种方式&#xff1a;每次折叠或展开后触发…

node管理工具nvm

使用nvm可以切换node版本、命令安装node 一、nvm下载安装 1、下载 nvm-setup.zip - 蓝奏云 在github可以选择最新版的【nvm】&#xff1a;&#xff08;nvm-windows 最新下载地址&#xff09;Releases coreybutler/nvm-windows GitHub nvm-noinstall.zip&#xff1a; 这个…

基于edk2编译arm64版intel网卡undi驱动

本文介绍如何在edk2下面编译intel undi驱动。 edk2版本edk2-stable202305 文章目录 一、源码下载二、驱动编译2.1 第一次编译IntelXGigUndi及修改2.2 Intel其他undi驱动编译三、驱动二进制文件四、驱动使用方法一、源码下载 intel 网卡驱动下载地址 https://www.intel.com/con…

MySQL 数据库 - 事务

MySQL 数据库&#xff08;基础&#xff09;- 事务 事务简介 事务 是一组操作集合&#xff0c;他是一个不可分割的工作单位&#xff0c;事务会把所有的操作看作是一个整体一起向系统发送请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 比如&#xff1a;张…

C#医学影像管理系统源码(VS2013)

目录 一、概述 二、系统功能 系统维护 工作站 三、功能介绍 影像采集 统计模块 专业阅片 采集诊断报告 报告管理 一、概述 医学影像存储与传输系统&#xff08;PACS&#xff09;是一种集成了影像存储、传输、管理和诊断功能的系统。它基于数字化成像技术、计算机技术和…

STM32CubeMX配置STM32G071输入捕获(HAL库开发)

1.时钟配置HSI主频配置64M 2.配置好串口&#xff0c;选择异步模式 3.配置TIM1_CH1产生1KHz的信号&#xff0c;主频64MHz&#xff0c;分频&#xff08;64-1&#xff09;&#xff0c;计数周期&#xff08;1000-1&#xff09;&#xff0c;这样即可生成1KHz信号。 4.配置TIM3_CH1和…

农业旅游与乡村旅游:融合绿色田野与诗意远方的经济新篇章

在这个快节奏的时代&#xff0c;人们对于回归自然、体验淳朴生活的渴望日益增强。农业旅游与乡村旅游&#xff0c;作为新兴的旅游形态&#xff0c;正逐步成为连接城市与乡村的桥梁&#xff0c;不仅为都市人提供了一片心灵的栖息地&#xff0c;也为农村地区带来了前所未有的发展…

昇思25天学习打卡营第15天|munger85

K近邻算法实现红酒聚类 现在数据集这个就是红酒的分类的数据集红酒每一个都会有很多的属性有三个属性下载数据集&#xff0c;这个是红酒的分类的数据集&#xff0c;红酒每一个都会有很多的属性&#xff0c;有三个属性。这十三个属性就可以用来分辨它是哪一个13个属性就可以用来…

Nacos部署升级1.4.2到2.3.1版本

一.下载安装&#xff1a; https://github.com/alibaba/nacos/releases/download/2.3.1/nacos-server-2.3.1.zip 下载完成解压即可 二.新旧版本数据结构有变化需要同步数据结构&#xff1a; ALTER TABLE config_info ADD encrypted_data_key TEXT NOT NULL COMMENT ‘秘钥’;…

【第5章】Spring Cloud之Nacos服务注册和服务发现

文章目录 前言一、提供者1. 引入依赖2.配置 Nacos Server 地址3. 开启服务注册 二、消费者1. 引入依赖2.配置 Nacos Server 地址3. 开启服务注册 三、服务列表四、服务发现1. 获取服务列表2. 测试2.1 获取所有服务2.2 根据服务名获取服务信息 五、更多配置项总结 前言 本节通过…

hot100 | 十四、贪心

1-leetcode121. 买卖股票的最佳时机 注意&#xff1a; Labuladong的套路太厉害了&#xff0c;分析的很清晰状态转移方程 public int maxProfit(int[] prices) {int n prices.length;int[][] dp new int[n][2];for (int i 0; i < n; i) {if (i-1 -1){// base casedp[…