一. 问题展现
通常我们在大多数的面试中,遇到关于集合的问题都是比较多的。一般情况下,许多面试官通常都会问我们关于Set集合和Map集合的相关知识点,并对此进行重重陷阱的布置,此时很多面试者往往就很容易被带到面试官挖好的陷阱里。另外就是双向链表,也是面试频率相对较多且较复杂的问题,甚至还有一些面试官在问完双向链表的相关知识点后,还会变态地叫我们手写出一个单向链表,以此来考察面试者对链表的掌握情况。所以壹哥今天就带大家手写一个单向链表,让我们一起理清单向链表的实现思路。
二. 内容详解
1. 实现思路
如果我们想要实现一个单向链表,就要理解单向链表是如何实现的,这里我们先来一个思维导图,脑海中先有一个实现思路。
根据上图中的有效信息,我们可以大致了解:如果我们想要创建一个单向链表,内部所含变量包含有节点类,而节点内要有值,以及下一个节点的值,并可以持续添加,无限循环地向下递增。
此时我们需要再考虑一个问题,链表既然有增加操作,那就同样需要有减少操作,可是我们此时该如何去进行正确地删减节点呢?其实我们可以向ArrayList一样去设置一个类似指针的东西,每添加一个节点就进行加一操作,每删除一次就进行减一操作。
2. 实现代码
源码如下:
这时候,可能就会有小伙伴疑问,这不就是一个类吗,这样理解也并非错误!其实链表及其他的集合都是一个类,只是这个类赋予了各个集合不一样的功能。
3. 添加功能
在我们最开始接触Java时,我们听到的最多的内容,就是通过Java语言来实现数据的CRUD(增删改查),而作为拥有存储功能的单向链表来说,一样可以赋予其增删改查的功能,接下来就是相关源码。
关于添加其实很好理解,因为有关联关系直接绑定关系即可。
4. 删除功能
删除数据的功能实现如下:
删除功能的实现,壹哥认为是比较复杂的。因为有了绑定关系,就需要判断给定的下标是在开头还是结尾,或者是在中间。如果是在开头的话,那么就不会涉及当前节点的上一个节点,只需要把下一个节点替到前面来即可;如果是结尾,则需将删除节点中上一个节点的下一个关联节点修改为null即可;而如果是中间节点,则需要将当前节点的下一个节点关联到当前节点的下一个节点即可。
5. 修改功能
修改数据的功能实现如下:
修改时要确定传入的下标值与当前链表的size比对。其实细心的小伙伴可以观察到,修改功能其实和删除功能有很大的相似之处,无非就是将对应的下标遍历到,然后在其对应位置将数据值替换即可。
6. 查询功能
查询数据的功能实现如下:
查询数据其实也是大同小异的,就是将节点遍历,将数据以带缓存区的字符串进行拼接,这里其实也可以更换为数组来代替也是可以的,根据需求来设定即可。
7. 执行结果
接下来,就请小伙伴和壹哥一起来看看最终的输出结果吧。
以上就是壹哥对单向链表的手动实现,相信各位在看完本文的详解后,许多小伙伴对于单向链表的了解也能更为精进啦。如果大家想要获取更多关于单向链表等内容,可以在评论区给壹哥留言哦!!!