课时141:链表(数据删除)
摘要:
1. 数据删除的定义
2. 在 ILink 接口里面追加新的删除方法
3. 后续节点判断
4. 完善 LinkImpl 子类中的 remove() 方法
01.什么是数据删除
数据的删除指的是可以从集合里面,除掉指定的一个数据内容,此时传递的是数据内容,那么如果要实现这种删除操作,依然需要对象比较的支持。
02.数据删除
2.1集合数据的删除的两种情况:
(1)要删除的是根节点数据( LinkImpl 与根结点有关,所以这个判断由根节点完成 ):假设下图是存的数据,是由根节点指向第一个数据节点,这是 Root 作用。Root 指向第一个节点只是引用,可以让 Root 指向第二个数据节点,在这里实现了引用修改。
第一个数据没有指向,就表示该节点已经空出去了,便可以实现删除,这是第一种删除在根节点的情况下,不一定节点都在根节点。
(2)要删除的不是根节点数据(由 Node 类负责): 在此根节点此前已经判断过,如果要再次判断就需从根节点下一个开始判断,如果现在要删除,那么过程很简单,当前节点的上一个.next 指向当前的.next 就空出节点了,这样便实现删除了。
2.2在 ILink 接口里面追加新的删除方法
public void remove(Ee):// 数据删除
2.3在 LinkImpl 子类里面实现根节点的判断
Public void remove (E data) { If ( this.contains (data) ) { // 判断数据是否存在 If (this.root.data.equals(data) ) { // 根节点为要删除节点 this.root = this.root.next ;// 根的下一个节点 } this.count -- ; } }
代码执行结果:
03.后续节点判断
3.1节点判断
如果现在更节点并不是要删除的节点,那么就需要进行后续节点判断,但是请一定要记住,此时更节点已经判断完成了,那么在判断,应该从根节点的下一个开始判断,在 Node 类中追加删除处理。
public void removeNode(Nde previous,E data) { If ( this.data.equalsdata ) ) { previous.nexthis.next ; //空出当前节点 } else { { if ( this.next !=null ) { // 有后续节点 this.next.relmoveNode(this,data) ;//向后继续删除 } } }
3.2完善 LinkImpl 子类中的 remove()方法
If (this.contains(data))mals(data) ) { // 判断数据是否存在 If (this.root.data.equals (date) ) { // 根节点为要删除节点 this.root = this.root.next ; // 根的下一个节点 } else { // 交由Node类负责删除 this.root.next.removeNode(this.root,data) ; } this.count -- ; } }
代码执行结果:
删除逻辑依靠的就是引用的改变处理完成的。