面试问题之链表 (LinkedList)

今天的面试中有一个比较有意思的题目,其实应该主要还是考察思路吧,可能是链表有比较长的时间没有看了,感觉问了下被问得有点懵。

要实现的东西就是在链表中实现从链表的后面取倒数第二个元素。

​编辑

 * Assuming we have the following list: 1 → 2→ 3 → 4 → 5 → 6 → 7* And a number k = 2

ArrayList 实现

如果不考虑数据结构,不管你是用 List 还是 ArrayList 还是 LinkedList 都很好实现的。

 Integer k = 2;List<Integer> inputList = new ArrayList<>();inputList.add(1);inputList.add(2);inputList.add(3);inputList.add(4);inputList.add(5);inputList.add(6);inputList.add(7);log.debug("{}", inputList.get(inputList.size() - k - 1));

使用List Size 的方法,从后面返回。

List 反转方法

下面可以用 List 反转的方法来做。

Collections 中有一个反转的方法,可以直接把 List 反转。

        Integer k = 2;List<Integer> inputList = new ArrayList<>();inputList.add(1);inputList.add(2);inputList.add(3);inputList.add(4);inputList.add(5);inputList.add(6);inputList.add(7);Collections.reverse(inputList);log.debug("{}", inputList.get(k));

自定义链表

下面就来说说自定义链表的方式来做这个了。

感觉这个就应该面试的人希望做的吧。

创建链表数据结构

首先我们需要定义链表数据结构,因为很长时间没有弄链表了,差不多自己都忘记了。说心里话当时都没有想出来怎么自定义链表。

在这里,我们可以定义一个单向链表,我们也可以定义一个双向链表。

非常非常重要的是,在定义完成 Node 后,我们还需要定义一个 head,这个 head 是 Node 对象。

在做题的时候,这个地方忘记了。

所以完整的定义应该是下面的代码:

    Node head = null;public class Node {public Integer data;public Node prev;public Node next;public Node(int data) {this.data = data;}public Integer getValue() {return this.data;}}

因为是单向链表,所以上面我们定义的 Node prev 其实是没有什么意义的。

​编辑

添加元素方法

当数据结构定义后,下一步就应该是要添加元素了。

所以我们需要一个添加 Node 节点的方法。

方法的代码如下:

    public void addNode(int d) {Node newNode = new Node(d);if (head == null) {head = newNode;return;}Node tmp = head;while (tmp.next != null) {tmp = tmp.next;}tmp.next = newNode;}

这个方法是无返回的。

首先初始化一个 Node 对象,然后检查 head 是否为 null。

如果 head 为 Null,那么就把这个新初始化的对象放到 head 中。

如果 head 不为 Null,那么就遍历链表,找到链表的末尾添加上去。

获得链表长度

这个方法你可能不需要,但是有可能有助于帮助你链表的初始化情况。

获得长度就非常简单了。

对链表进行遍历到链表的末尾,如果为 null 的话,就返回计数器。

方法如下:

    public int lenght() {int lenght = 0;Node tmp = head;while (tmp != null) {lenght++;tmp = tmp.next;}return lenght;}

返回从后面数的元素。

这个地方有很多方法可以实现,你可以把链表放入到 List 后,然后遍历。

你也可以实现一个 Get 下标元素的方法,这个时候你就需要上面我们写的 Get List 长度的方法了。

这个方法是后来我考古找到的,其实如果是大学生的话,这个方法老师应该说过。

双指针步进式查找法。

完整代码如下:

    public Node moveSteps(Node head, int k) {if (k < 1 || k > this.lenght()) {return null;}Node p1 = head;Node p2 = head;for (int i = 0; i <= k; i++)p1 = p1.next;while (p1 != null) {p1 = p1.next;p2 = p2.next;}return p2;}

可以认为我们 p1 定义的是第一个指针计数器, p2 是第二个指针计数器。

​编辑

所以通过双指针的方法,只需要一个循环就可以完成上面的算法了。直接把 P2 输出就好了

需要注意的是,因为要求是返对应移动 2 步的下标。

所以上面第一步的 For 循环应该是 i<=k ,而不是 j<k,不过这个地方的代码比较调试,没太大问题。

就是这里需要注意下。

总结

说心里话,这个题目真正在代码平台上,答得并不是很好。

总结下就是对链表应该是知道怎么表达的,具体的写法应该还是明白的,问题就在于后面的反转算法上。

在大部分情况下,我们应该都会用的是 Size 减去需要移动的步数,或者是想到的是 List 反转,这是因为 JDK 已经提供了 Collections.reverse(inputList); 方法了。

并不认为实现这个方法的难度在那里,但是更主要的是想问下对数据结构或者链表这个数据结构熟不熟悉吧。

如果你不经常用,可能不熟悉,大部分情况下你可能用的是 ArrayList,真正用 LinkedList 的时候不多。

很多人应该都没有选择障碍综合症,直接 ArrayList。

最后,参与面试的人问了还有没有其他办法吗?除了获得 List 总数后 get value

我想了下,可能还有就是用 HashMap, Key 是数字序列,Value 是 Node 对象。

这个也还是需要遍历一次链表,当然对这个问题也是可行的,到最后你就直接 Get(K) 就行了。也不是不可以。

链表

链表的这个问题,在这几年的面试中,被问到了 2 回,很多公司有点喜欢拿链表说事。

这也无可厚非,链表这东西本身比较冷门,如果你在找工作之前没有认真看看或者想起来链表怎么存和在 Java 的代码中是怎么实现的话可能才上来就会有点懵的。

建议是,找工作的小朋友还是需要看看链表的这个数据结构的,感觉这个数据结构在很多面试的时候都会问到。

Solution.java (2.0 KB)

上面我就把这个问题的解答给贴上来了。

虽然题目没有完全做出来,还是有点遗憾。

IT 这个行业已经有点开始卷得让人不知道要做什么了,真正业务上面的没人做,程序上面很多时候都要做算法,一些算法是比较难在 30 分钟内写出来并且实现的。

每次面试,千万都不要太当回事情,有时候更多的是一种缘分。

如果有缘分的话,一切水到渠成。

对每次面试多总结下,总会有所进步的。感觉这次面试的时候面试的人自己也没有在上面调试过代码,否则我们还花了点时间在编译器错误上面。

这样说吧,我并不认为每次给你面试的人都会认真自己把代码跑通,上面的这个问题,我相信如果是我去面试别人的话,我先要把自己的的代码跑通,这样在别人写代码的时候,我也能够及时的帮助别人纠正语法错误。

也许,这就是现在所有 OA 的现状吧,OA 你的人自己代码都没有完整跑通过。哈哈。

面试问题之链表 (LinkedList) - 求职路上 - iSharkFly

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

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

相关文章

面向对象【递归方法】

文章目录 递归编写递归函数递归的工作原理常见的递归应用场景递归注意点 递归 递归是一种解决问题的方法&#xff0c;其中一个函数调用自身以解决较小的实例&#xff0c;直到达到基本情况&#xff08;停止条件&#xff09;&#xff0c;然后开始返回结果。递归可以让我们更容易地…

python安装第三方模块方法

正常情况下安装python第三方模块没啥说的&#xff0c;但是由于python安装模块默认是在外网下载安装&#xff0c;牵扯外网网速问题&#xff0c;所以可以配置下使用国内某镜像源来下载模块 python -m pip install xxxxxxxxxxx 和 pip install xxxxxxxxxx 的命令都可下载安装第三…

【Linux指令集】---git命令的基本使用

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Linux专栏】&#x1f388; 本专栏旨在分享学习Linux的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 演示环境&#xff1…

C理解(一):内存与位操作

本文主要探讨C语言的内存和为操作操作相关知识。 冯诺依曼结构和哈佛结构 冯诺依曼结构&#xff1a;数据和代码放在一起,便于读取和修改,安全性低 哈佛结构是&#xff1a;数据和代码分开存放,安全性高,读取和修麻烦 内存 内存是用来存储全局变量、局…

《动手学深度学习 Pytorch版》 7.5 批量规范化

7.5.1 训练深层网络 训练神经网络的实际问题&#xff1a; 数据预处理的方式会对最终结果产生巨大影响。 训练时&#xff0c;多层感知机的中间层变量可能具有更广的变化范围。 更深层的网络很复杂容易过拟合。 批量规范化对小批量的大小有要求&#xff0c;只有批量大小足够…

1、Kafka 安装与简单使用

第 1 章 Kafka 概述 1.1 定义 Kafka传统定义&#xff1a; Kafka是一个分布式的基于发布/订阅模式的消息队列&#xff08;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域。 Kafka最新定义 &#xff1a; Kafka是 一个开源的 分 布式事件流平台 &#xff08…

LaTex的学习(学习于b站西北农林科技大学耿楠教授的教学视频)

目录 一、LaTeX软件的安装与环境配置  1.LaTeX软件texlive的下载  2. texlive的安装 二、用命令行实现LaTeX文档的编写  1.通过命令行演示LaTeX编写的过程  2.将编译LaTeX并生成pdf文件的过程封装成一个bat文件  3.演示一个含有中文的LaTeX文件 三、用TexStudio IDE实…

stm32无人机-飞行力学原理

惯性导航&#xff0c;是一种无源导航&#xff0c;不需要向外部辐射或接收信号源&#xff0c;就能自主进行确定自己在什么地方的一种导航方法。 惯性导航主要由惯性器件计算实现&#xff0c;惯性器件包括陀螺仪和加速度计。一般来说&#xff0c;惯性器件与导航物体固连&#xf…

四、YApi的安装和配置

YApi是去哪儿网的前端技术中心的一个开源可视化接口管理平台。 创建接口项目 创建接口 编写接口

常用中间件-OAuth2

1. 微服务权限校验Session共享 1.1 微服务权限校验 实现2号方案。使用Redis作为Session统一存储。 首先配置一下Nacos&#xff0c;参考https://blog.csdn.net/weixin_43917045/article/details/132852850 然后为每个服务添加验证机制&#xff0c;先导入依赖 <!-- SpringS…

富贵包 与 大椎穴

富贵包是什么 富贵包是指在后项与背交界处的脂肪堆积&#xff0c;形成一个包块样凸起&#xff0c;通俗来讲就是大椎穴气血运行不畅&#xff0c;淤堵增生的产物。 富贵包多出现在肥胖人群中&#xff0c;与经常低头玩手机、看书或低头办公的人群有关&#xff0c;导致这个部位血运…

如何配置代理

打开Clask&#xff0c;设置为系统代理&#xff0c;选择规则判断&#xff0c;规则判断就是需要走代理的走代理&#xff0c;不需要走的就不用走代理 本地使用代理 如何想要让某个地方使用代理&#xff0c;可以直接在该地方的终端进行设置 先复制一下终端代理命令&#xff0c;然…

Redis key基本使用

查看key的数据类型 string 、hash等 type key 查看key是否存在 exist key1 查看key的有效期 -1&#xff1a;永不过期 -2&#xff1a;已过期 设置key过期时间 expire key seconds expireat key 日期 key移动到其它库 move key index redis 默认是16个库 0,1,2,…15 切换数据库【…

FPGA的数字钟带校时闹钟报时功能VHDL

名称&#xff1a;基于FPGA的数字钟具有校时闹钟报时功能 软件&#xff1a;Quartus 语言&#xff1a;VHDL 要求&#xff1a; 1、计时功能:这是数字钟设计的基本功能&#xff0c;每秒钟更新一次,并且能在显示屏上显示当前的时间。 2、闹钟功能:如果当前的时间与闹钟设置的时…

爬虫,初学者指南

第一篇&#xff1a;爬虫入门request模块的基本使用以www.douban.com为例 get请求&#xff1a; # 查看响应数据&#xff0c;返回的是Unicode格式的数据 print(response.text)# # 查看响应数据&#xff0c;返回的是字节流数据&#xff08;图片视频等&#xff09; print(response…

redis常用操作命令

日升时奋斗&#xff0c;日落时自省 注&#xff1a;命令区分有点细&#xff0c;择取自己需要的即可 目录 1、单机架构 2、数据库和应用分离 3、分布式基本概念 3.1、应用&#xff08;Application&#xff09;/系统(System) 3.2、模块&#xff08;Module&#xff09;/组件&…

本地搭建kafka并用java实现发送消费消息

1、下载kafka的jar包文件 https://www.apache.org/dyn/closer.cgi?path/kafka/3.1.0/kafka_2.12-3.1.0.tgz2、下载完成直接操作命令启动 1、打开新的terminal(终端)窗口&#xff0c;进入kafka的bin目录 启动zk./zookeeper-server-start.sh ../config/zookeeper.properties2、…

ubuntu 20 安装 CUDA

1. 查看需要安装的cuda版本 nvidia-smi cuda的版本信息如下图所示 2. 去官网下载对应版本的CUDA 官网&#xff1a;CUDA Toolkit Archive | NVIDIA Developer 弹出以下界面&#xff0c;依次点击以下按钮 得到以下内容&#xff1a; 复制下载链接&#xff0c;下载cuda11到本…

现代数据架构-湖仓一体

当前的数据架构已经从数据库、数据仓库&#xff0c;发展到了数据湖、湖仓一体架构&#xff0c;本篇文章从头梳理了一下数据行业发展的脉络。 上世纪&#xff0c;最早出现了关系型数据库&#xff0c;也就是DBMS&#xff0c;有商业的Oracle、 IBM的DB2、Sybase、Informix、 微软…

【CTFHUB】SSRF绕过方法之靶场实践(二)

SSRF POST请求 提示信息&#xff1a; 这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.加油吧骚年 首先测试了http的服务请求&#xff0c;出现对话框 输入数值后提示&#xff1a;只能接受来自127.0.0.1的请求 右键查看源码发现key值 通过file协…