LinkedList删除元素的源码解析

概念:链表是链式存储的表,是一种非连续非顺序的存储结构,数据元素是通过链表中的指针/地址链式存储起来的。

特点:查找慢,增删快。

删除元素

这里要注意两个特殊情况,一个是删除的头节点,一个是删除的是尾节点

(1)如果x的 前一个结点为null,说明x的原为头节点,新头节点应该为x的后一个结点
(2)如果x的 后一个结点为null,说明x的原为尾节点,新尾节点应该为x的前一个结点

具体代码实现会在下面一点讲哦

 //内部通用方法 -  将指定节点脱离
    private E unlink(Node<E> x) {
        //1.定义变量 记录x结点数据、x的前一个结点、x的后一个结点
        final E element = x.item;//储存元素信息
        final Node<E> next = x.next;
        final Node<E> prev = x.prev;
        //2.处理x的前一个结点相关数据
        //(1)如果x的 前一个结点为null,说明x的原为头节点,新头节点应该为x的后一个结点
        //(2)如果x的 后一个结点为null,说明x的原为尾节点,新尾节点应该为x的前一个结点
        if (prev == null) {
            first = next;
        } else {
            prev.next = next;
            x.prev = null;
        }

        if (next == null) {
            last = prev;
        } else {
            next.prev = prev;
            x.next = null;
        }
        //3.有利于垃圾回收
        x.item = null;
        return element;
    }

LinkedList里可以有null元素,删除null元素时,只会删除第一个null

但是,在工程上为了提高效率一般都会将删除头节点和删除尾节点的操作单独拎出来来做

删除头节点

//内部通用方法 -  将第一个节点脱离
    private E unlinkFirst(Node<E> f) {
        //1.定义变量记录f的数据、f的下一个元素
        E element=f.item;
        Node<E> next=f.next;
        //2.将first置为f的下一个
        //若f的下一个为null,则证明当前集合只有一个元素,则应将last也置为null
        f.item=null;
        f.next=null;//对代码的实现无影响,但是可以帮助GC (垃圾回收)
       
        first=next;
        if(next==null){
            last=null;
        }else{
            next.prev=null;
        }
        return element;
    }

对于垃圾回收机制,大家可去参考其他文档。 

删除尾结点

//内部通用方法 -  将最后一个节点脱离
    private E unlinkLast(Node<E> l) {
        E element=l.item;
        Node<E> prev=l.prev;
        l.item=null;
        l.prev=null;//帮助 GC
        //将last置为l的上一个
        //若l的上一个为null,则证明当前集合只有一个元素,则应将first也置为null
        last=prev;
        if(prev==null){
            first=null;
        }else {
            prev.next=null;
        }
        return element;
    }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值