java单链表节点翻转_自己手写Java代码实现数据结构中的单链表及Java面试题链表反转...

LinkedList就是链表,链表分两种,单链表和双链表。他们之间有什么区别呢

单链表概念模型

画的不好看,重点不在于看画。每一个黑色框表示一个元素,红色框为元素后置节点,该节点引用下一个元素,以此类推直到表中最后一个元素,此时他的后置节点为空,这就是链式结构中的单链表,那么既然有单链表就一定有双链表了,别急我们先看看单链表如何反转。为什么要反转呢,使用一种数据结构的选择条件就是它自身拥有特殊的功能,链表的特性之一就是可以反转,怎么做呢?链表反转是一种常问的基础面试题。

很简单,如果不简单就不会用链表了。从末尾开始,它的后置节点本来是空的,现在将它引用倒数第二个元素,倒数第二个元素的后置节点原本指向原来的末尾元素,也就是反转后的第一个节点,现在更改为指向倒数第三个节点,一次类推直到反转前的第一个元素,它的后置节点此时作废,指向null。链表反转有一个常见的应用就是正序排列转倒序,能够迅速完成反转,但是单链表有一个弊端,我如何找到最后一个元素呢,需要遍历整个链表,找到元素后置节点为空的元素,那它就处于链表末端,那现在如果删除链表中最后一个元素怎么办?我们需要找到链表中倒数第二个元素,然后将它的后置节点设为空,此时原本末端元素被废弃,它不被任何对象引用GC就会回收它。现在需要解决的问题是如何找到链表中倒数第二个元素,需要遍历两次链表外加使用一个计数器。怎么做呢,我们封装一个方法,用来删除末端元素。

这是Node节点类,我们以节点为单位,因为每一个节点储存着下一个元素的信息,那么节点里存元素,元素里存节点,这种被称为自关联,稍微有点复杂的逻辑,变量next表示下一个节点,变量element表示元素储存的对象。numberCounter是一个公有的计数器,下面会用到。Node的构造方法,需要传入当前元素储存的对象与节点next。lastOne变量作方法返回值,表示链表中最后一个元素。之前提到过最后一个元素具备什么样的特征呢?就是节点信息为null,那我们只要不停地迭代找出节点next为null的Node返回即可。代码实现中使用了递归的方式,用lastOne储蓄当前元素信息,经过多少次递归之后,if中条件为false的时候,那当前元素lastOne就是最后一个元素,返回即可。

这是删除单链表最后一个元素的方法,思路我上面已经说过了两次迭代+一个计数器index。先说一下如何使用Node创建链表,只要在构造方法里第一个参数节点不断new出新的node即可,直到节点为null就结束。接下来我们调用找出最后一个元素的方法,这是第一次迭代,调用它的目的是我需要统计numberCounter编译全部元素所需次数,为什么呢?遍历numberCounter-1次时,当前元素就是倒数第二个元素,我们就可以给它的节点信息赋值为null了。当然了也有另外一种方法,就是我在图中写的方式,结果是一样的,当index=0的时候就能找出倒数第二个元素。其中用红色框圈出的就是打印倒数第二个元素的方法,那倒数第二个元素就是值为String类型的3,蓝色框框出的是第一个元素的打印方法,粉色框框出的为第一个元素与倒数第二个元素之间的打印方法,最后知道index=0时,我们将倒数第二个元素节点赋值为null,到处为止最后一个元素删除完毕。此方法实现共用了两次遍历+一个计数器,第一次遍历在n.findLastOne();方法,采用递归遍历,第二次就是上面的for循环了。那么我如果想删除倒数后两个元素怎么办?调用两次这个方法即可,不过这种操作是存在很大缺陷的,极大的浪费了性能。

双链表就恰恰改善了这部分缺陷,它使用双节点形式储存前后元素信息,这样就能够减少一次迭代了。双链表实现代码请看我的下一篇文章!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值