链表面试练习习题集(Java)

1.

思路:

因为杨辉三角是由二维数组构成,所以要先创建一个二维数组,如何用顺序表表示二维数组,可以通过List<List<Interger>>来表示一个二维数组,可以这样理解:先创建一个一维数组List,然后这个一维数组里面存放的元素类型是:<List<Integer>>,即接收整型的一维数组,所以一个一维数组中每个元素存的还是一维数组,那么就相当于二维数组了。

然后杨辉三角每行的第一列为1,则add(1)即可,中间为上一行对齐的两个元素之和,所以要先通过对二维数组get得到上一行的数组,再通过对上一行的数组get得到对齐的那两个元素,最后将和add到这一行的一维数组里,如此类推

最后每一行的最后一列元素也是1,因为add的底层实现是尾插,所以我们直接add(1)即可,最后再将这一行的一维数组add到二维数组里

class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> list=new ArrayList();//二维数组List<Integer> list1=new ArrayList<>();//一维数组list1.add(1);list.add(list1);for (int i = 1; i < numRows; i++) {//第一列List<Integer> curRow=new ArrayList<>();curRow.add(1);//中间List<Integer> preRow=list.get(i-1);for (int j = 1; j < i; j++) {int a=preRow.get(j-1);int b=preRow.get(j);curRow.add(a+b);}//最后一列curRow.add(1);list.add(curRow);}return list;}
}

2.

思路:

看到求中间的东西,大概率会用到快慢指针,即当慢指针走一步,快指针走两步,当快指针到达终点时,慢指针刚好在中间,因为很简单的公式:路程=速度*时间;时间t相等,v快=2v慢,s=v快*t,v慢*t=1/2s

当结点为奇数个数时,刚好为中间的结点,当结点为偶数个数,为中间的第二个结点,根据快慢指针一个走两步,一个走一步,刚刚好都满足,所以就不用分类讨论了

什么时候停止指针移动呢,根据示例1和2,在示例1中,当快指针在5这里停止,在示例2中,当快指针在6的后面(即null)这里停止,所以循环条件为fast!=null&&fast.next!=null,注意&&前后两个条件不能换,必须先fast!=null再fast.next!=null,因为互换的话,当fast==null时,fast.next会报异常

class Solution {public ListNode middleNode(ListNode head) {if(head==null){return head;}ListNode slow=head;ListNode fast=head;while(fast!=null&&fast.next!=null){slow=slow.next;//走一步fast=fast.next.next;//走两步}return slow;}
}

3.

思路:

需要两个指针,一个记录当前结点cur,一个记录前面的那个结点precur,一开始都指向头结点head。如果cur的val等于传入的val,则先将cur往后移动一位,然后precur.next指向cur;否则precur走到cur的位置,cur往后移一步,循环条件为cur!=null,这是一般情况的代码

如果一开始头结点就等于val,即示例3的情况,那么按照上面的代码就不能将头结点移除,所以我们要判断一开始头结点是否为val,如果为val,则新头结点为头结点的后一个,因为移除完后的新头结点有可能仍然等于val,所以不是用if而是while,如果头结点为null,则说明全是val,如示例3的情况,此时就返回新头结点(也就是null)

一般都是先考虑正常情况,然后再来考虑特殊情况

class Solution {public ListNode removeElements(ListNode head, int val) {if(head==null){return head;}//解决一开始头结点的值就为valwhile(head.val==val){head=head.next;if(head==null){return head;}}//说明此时头结点一定不为valListNode cur=head;//当前结点ListNode precur=head;//前结点while(cur!=null){if(cur.val==val){cur=cur.next;precur.next=cur;}else{precur=cur;cur=cur.next;}}return head;}
}

4.

思路:

因为是反转,所以可以确定的是,第一个结点反转后一定是最后一个结点,所以我们要将头结点的next改为null,但改之前要记录头结点的下一个结点。然后采用每遍历一个结点就进行头插,即该结点cur的next指向头结点,但修改next的指向时,要先将原来的next指向的结点进行保存,保存到curN,然后头插完,cur=curN,循环条件为cur!=null

class Solution {public ListNode reverseList(ListNode head) {if(head==null){return head;}//必要处理ListNode cur=head.next;//第一步:记录头结点的next结点head.next=null;//第二步:头结点的next改为null//循环遍历,使用头插while(cur!=null){ListNode curN=cur.next;//循环中的第一步:记录下一个结点cur.next=head;//第二步:当前结点头插到头结点之前head=cur;//第三步:新的头结点为当前结点cur=curN;//第四步:当前结点后移到原来的下一个结点位置}return head;}
}

5.

思路:

法一:可以利用我们刚刚上面那道题的代码,先将链表反转,再遍历第k个结点即可

法二:遍历两次,第一次求长度len,第二次遍历到第len-k个结点即可

法三:利用集合顺序表arraylist,遍历一次,用add将里面所有的元素放进顺序表里,然后再get(arraylist.size()-k)即可

法四:快慢双指针,先提前让快指针走k步,然后慢指针和快指针以相同的速度每次走一步,当快指针走到最后时,慢指针的位置即为倒数第k个结点

示例代码(法一)

class Solution {public int kthToLast(ListNode head, int k) {if(head==null){return -1;}//反转链表ListNode cur=head.next;head.next=null;while(cur!=null){ListNode curN=cur.next;cur.next=head;head=cur;cur=curN;}//然后找ListNode node=head;for(int i=1;i<k;i++){node=node.next;}return node.val;}
}

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

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

相关文章

智慧消防建设方案(完整方案参考PPT)

智慧消防系统建设方案旨在通过物联网、大数据与云计算技术&#xff0c;集成火灾自动报警、智能监控、应急指挥等功能于一体。方案部署智能传感器监测火情&#xff0c;实时数据分析预警&#xff0c;实现火灾早发现、早处置。构建可视化指挥平台&#xff0c;优化应急预案&#xf…

Redis之List列表

目录 一.列表讲解 二.列表命令 三.内部编码 四.应用场景 Redis的学习专栏&#xff1a;http://t.csdnimg.cn/a8cvV 一.列表讲解 列表类型是用来存储多个有序的字符串&#xff0c;如下所示&#xff0c;a、b、c、d、e五个元素从左到右组成了一个有序的列表&#xff0c;列表中的…

android R ext4 image打包脚本介绍

一、Android R打包指令使用介绍 &#xff08;1&#xff09;mkuserimg_mke2fs #./mkuserimg_mke2fs --help usage: mkuserimg_mke2fs [-h] [--android_sparse] [--journal_size JOURNAL_SIZE][--timestamp TIMESTAMP] [--fs_config FS_CONFIG][--product_out PRODUCT_OUT][--b…

目标检测入门:4.目标检测中的一阶段模型和两阶段模型

在前面几章里&#xff0c;都只做了目标检测中的目标定位任务&#xff0c;并未做目标分类任务。目标检测作为计算机视觉领域的核心人物之一&#xff0c;旨在从图像中识别出所有感兴趣的目标&#xff0c;并确定它们的类别和位置。现在目标检测以一阶段模型和两阶段模型为代表的。…

常见漏洞之SSRF

一、SSRF简介 服务器端请求伪造&#xff08;SSRF&#xff09;是一种安全漏洞&#xff0c;允许攻击者通过构造恶意请求并利用存在缺陷的Web应用作为代理&#xff0c;向内外网发送请求&#xff0c;以实现攻击目的。SSRF攻击主要利用了服务端提供的某些功能&#xff0c;这些功能能…

基于jeecgboot-vue3的Flowable流程仿钉钉流程设计器-支持VForm3表单的选择与支持

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、初始化的时候加载表单 /** 查询表单列表 */ const getFormList () > {listForm().then(res > formOptions.value res.result.records) } 2、开始节点的修改&#xff0c;增加表…

【转盘案例-开始选号按钮-旋转 Objective-C语言】

一、接下来,我们来说这个“开始选号”按钮, 1.我们之前已经可以自旋转了,当我点击开始选号按钮之后,我让它快速的去旋转,5圈儿,然后停在最上方, 我先把ViewController的startRotate这句话啊,注释掉,先不让它自旋转呢, 把这句话注释掉, 接下来,我们command + R, …

Java---抽象类

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 文章目录 抽象类什么的抽象类&…

stm32入门-----EXTI外部中断(上 ——理论篇)

目录 前言 一、中断系统 1.基本概念 2.执行过程 二、stm32中断 1.stm32中断类型 2.NVIC总管 3.NVIC的优先级分组 三、EXIT外部中断 1.基本概念 2.AFIO复用IO口 3.EXIT执行过程 前言 本期我们就开始进入到学习stm32的中断系统了&#xff0c;在此之前我们学习过51的知道中…

KAFKA搭建教程

KAFKA搭建教程 期待您的关注 KAFKA学习笔记 帮助更多人 目录 KAFKA搭建教程 1.下载Kafka并解压 2.添加环境变量 3.修改 server.properties 文件 4.将kafka复制到其它节点 5.修改node1、node2节点的broker.id 6.将master的环境变量同步到node1、 node2 7.启动zookeeper…

乐鑫ESP-IoT-Bridge方案简化设备智能联网通信,启明云端乐鑫代理商

随着物联网技术的快速发展&#xff0c;设备联网已成为实现智能化的关键一步。然而&#xff0c;不同设备之间的通信协议、接口等差异&#xff0c;使得设备联网变得复杂且困难。 乐鑫推出的ESP-IoT-Bridge联网方案&#xff0c;正是为了解决这一难题&#xff0c;为物联网场景下的…

【iOS】类对象的结构分析

目录 对象的分类object_getClass和class方法isa流程和继承链分析isa流程实例验证类的继承链实例验证 类的结构cache_t结构bits分析实例验证属性properties方法methods协议protocolsro类方法 类结构流程图解 对象的分类 OC中的对象主要可以分为3种&#xff1a;实例对象&#xf…

HTML2048小游戏(最新版)

比上一篇文章的2048更好一点。 控制方法&#xff1a;WASD键&#xff08;小写&#xff09;或页面上四个按钮 效果图如下&#xff1a; 源代码在图片后面 源代码 HTML <!DOCTYPE html> <html lang"en"> <head><meta charset&…

Qt日志库QsLog使用教程

前言 最近项目中需要用到日志库。上一次项目中用到了log4qt库&#xff0c;这个库有个麻烦的点是要配置config文件&#xff0c;所以这次切换到了QsLog。用了后这个库的感受是&#xff0c;比较轻量级&#xff0c;嘎嘎好用&#xff0c;推荐一波。 下载QsLog库 https://github.c…

Python、Rust与AI的未来展望

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

leetcode简单题27 N.119 杨辉三角II rust描述

// 直接生成杨辉三角当前行 pub fn get_row(row_index: i32) -> Vec<i32> {let mut row vec![1; (row_index 1) as usize];for i in 1..row_index as usize {for j in (1..i).rev() {row[j] row[j] row[j - 1];}}row } // 空间优化的方法 pub fn get_row2(row_ind…

【C#】计算两条直线的交点坐标

问题描述 计算两条直线的交点坐标&#xff0c;可以理解为给定坐标P1、P2、P3、P4&#xff0c;形成两条线&#xff0c;返回这两条直线的交点坐标&#xff1f; 注意区分&#xff1a;这两条线是否垂直、是否平行。 代码实现 斜率解释 斜率是数学中的一个概念&#xff0c;特别是…

Windows 2012安装之实现远程连接

新建虚拟机 点击稍后安装操作系统 点击Microsoft Windows(W) 选择Windows Server 2012 设置虚拟机名称、安装位置 选择你的电脑核数 点击编辑虚拟机设置 点击CD/DVD(SATA) 使用ISO映像文件(M) 配置完之后点击确定 然后开启虚拟机 下一步&#xff1a; 点击现在安装&#xff1a…

【LeetCode】删除排序链表中的重复元素 II

目录 一、题目二、解法完整代码 一、题目 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;[1,2,5] 示例 …

【单片机毕业设计选题24069】-物联网节水灌溉系统设计

系统功能: 完成基于物联网的节水灌溉系统的电路图以及软件代码编写。要求系统可以通过传感器监测土壤的湿度和环境温湿度&#xff0c;如果土壤湿度低于限值和环境温湿度超过限值&#xff0c;则需开启继电器&#xff0c;打开电机水泵进行供水灌溉&#xff1b;当土壤湿度高于限值…