链表作为动态数组除了可以任意的进行长度的扩充外,还可以实现指定数据的删除操作,由于链表是一个Node对象的集合,所以在删除数据时需要考虑以下两种情况。
情况一:要删除的数据是根节点。
情况二:要删除的是子节点
1、【ILink】在接口中增加一个数据删除的方法
/**
* 删除指定内容的数据,需要利用equals()方法进行比较
* @param data要删除的数据
*/
public void remove(E data);
2、【Link.Node】在Node类中追加节点删除操作。
/**
* 删除指定数据对应的节点内容
* @param previous 要删除节点的上一个节点
* @param data 要删除的数据
*/
public void removeNode(Node previous,E data) {
if(this.data.equals(data)) { //数据内容比较
previous.next=this.next; //【删除】空出当前节点
} else { //数据内容不匹配
if(this.next!=null) { //有后续节点
this.next .removeNode(this, data); //向后继续删除
}
}
}
3、【Link】在子类中实现节点的删除
@Override
public void remove(E data) {
if(this.contains(data)) { //判断数据是否存在
if(this.root.data .equals(data)) { //根节点为要删除节点
this.root =this.root .next; //修改根节点引用
}else {
this.root .next .removeNode(this.root , data);
}
this.count--; //元素数量减少
}
}
Link子类需要进行根节点的存储,所以对于根节点的数据删除将由Link子类完成,而对于子节点的删除将由Node.removeNode()方法处理。元素一旦删除成功后,需要对count成员属性进行修改。