在实现单链表的过程中,我发现了一个问题,就是之前的实现无法对单链表的节点进行修改,原因是因为我将Node内部类的访问权限写成了private,那么就导致我无法访问Node节点,只能访问head头节点,而我这种实现方式,不是单链表,而是类似于队列的一种形式(只允许在两端进行操作),所以需要对前面的Node节点类进行修改,但这个还不着急。
今天要讲的是单链表的删除和插入(关于Node节点的访问权限问题,现在还不着急修改),删除单链表的节点,其实就是将此节点的next值赋给上一个节点的next。
上一篇的单链表的结构图不是特别严谨,所以特地推出新的单链表的结构图。如图所示:
其中节点名就是Node的变量名,数据区域指Node节点存放的数据,节点区域指Node节点存放的下一个节点是谁。
删除节点
找到需要删除的节点。(后面介绍,现在假设已经找到)
定义:
删除的节点称为node
被删除节点的上一个节点称之为lastNode
被删除的节点的下一个节点称为nextNode
操作:(图中lastNode的等号我忘记画了,各位小伙伴将就着看)
首先定义一个节点t用于记录node节点(直接将lastNode节点的next的值赋给t节点)
其次将lastNode的next值变为nextNode的值,最后在使得t的next为null。
其实最后一步可以省略,但是让其为null可以使得垃圾回收机制将其进行回收。
删除的大致流程都已经知晓,那么现在有几个问题,如何找到需要删除的数据?万一删除的数据是头结点怎么办?万一单链表就是空的怎么办?如何判断删除数据成功?如何结束删除?
寻找那个将要被抛弃的数据(真可怜)
进行遍历,找到需要删除的节点。
删除的数据是头结点怎么办?
进行判断,头结点的数据就是需要抛弃的数据,那就移动头结点。
链表为空,还删个锤子,直接返回false,删除失败。
判断数据是否删除成功,可以定义一个flag标志
当最后一个节点指向null节点时就结束循环。
代码借鉴:(可能我这个代码并不是最优化的,但是基本操作都是一样的,各位可以根据之前的删除节点的操作图,编写自己的代码实现。)
领取专属 10元无门槛券
私享最新 技术干货