java实例:Java中的链表及链表的增删查改_003

在上两篇文章中,为大家介绍了什么是链表,以及链表在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语句手动的结束了这个方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值