在上两篇文章中,为大家介绍了什么是链表,以及链表在Java中的实现方式,并自定义了增加元素和获取元素的方法addData()和getData(),今天我们继续向下进行,来了解一下删除方法该如何实现。
4)删除数据
在链表中,如果我们想要删除一个元素,实际上就是要改变指针的指向,比如上图,我们如果想删除下标为1的元素A,我们只要把原本蓝色区域的指针该成红色区域的即可,断掉A-->B和B-->C的指针,再让A-->C即可
知道了原理,现在让我们来看一下代码:
public void deleteData(int index){
if(index<0 || index>this.index-1) {
System.out.println("请输入正确的下标");
return;
}
if(index==0){
first=first.getNext();
this.index--;
return;
}
Node temp=first;
int tempIndex=0;
while (true){
if(tempIndex==index-1){
Node t=temp.getNext();
temp.setNext(t.getNext());
t=null;
this.index--;
return;
}else {
temp=temp.getNext();
tempIndex++;
}
}
}
现在我们一起来分析一下:
public void deleteData(int index){
if(index<0 || index>this.index-1) {
System.out.println("请输入正确的下标");
return;
}
首先我们定义了一个形参index用来接收需要删除的数据的下标。
然后我们来判断一下index的值是否规范,如果它比0还小或是比最后一个位置的下标还大,那么这个下标就没有意义了,我们给出一个提示,然后就得return结束这个方法了。
if(index==0){
first=first.getNext();
this.index--;
return;
}
接下来,我们来判断一下要删除的是不是第一个元素,如果是的话,因为不论是添加还是获取,我们对元素进行操作时,所参考的第一个元素其实都不是真的按照下标来的,而是按照头指针first,我们就通过直接让头指针后移一位即可。
而first=first.getNext();这段语句则正是实现这个功能的,我们先获取到first结点的下一个结点,第二个结点就到手了,再把它赋值给first,这样first的值就发生了改变。
在这之后,从效果上看,第一个元素就被删除了,因为我们删除了一个元素所以,我们需要让我们的全局变量index减少,让新添加的元素的位置发生改变,所以我们写下了 this.index--;语句。
Node temp=first;
int tempIndex=0;
while (true){
if(tempIndex==index-1){
Node t=temp.getNext();
temp.setNext(t.getNext());
t.setNext(null);
this.index--;
return;
}else {
temp=temp.getNext();
tempIndex++;
}
}
然后我们继续向下进行,还是和获取元素那一部分一样,我们创建一个临时变量temp用来当寻找目标的箭头,让它指向第一个结点,然后我们再建立一个tempIndex,因为是删除元素,我们就不能再让它指向当前所在位置的下标了,我们需要断开所删除元素的前一个结点的连接,所以要让tempIndex==index-1,代表temp指向了index的前一个结点,然后再创建一个始终为真的while循环,如果没找到这个位置,我们就执行else中的
temp=temp.getNext();
tempIndex++;
语句,让指针始终向后移动,如果找到了就进入if语句当中,此时指针指向index的前一个结点,我们先把要删除的目标,也就时temp的下一个结点放进临时变量t中,再把index前一个结点的后继指针指向index后面的结点,然后我们再通过 t.setNext(null);来将index的后继指针断掉即可。
同理,因为我们删除了一个元素,所以我们也需要在这个位置让我们的全局变量index减少一个,让新添加的元素的位置发生改变,所以我们在这里也加上一个 this.index--;语句。
到这里,删除的工作就完成了,循环也就没必要继续向下执行了,所以我们使用了return语句手动的结束了这个方法。