LinkekList部分源码

node信息

private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

add

进入add后,调用linkLast

public boolean add(E e) {
        linkLast(e);
        return true;
    }
	void linkLast(E e) {
		//之前的尾节点,  初始化为nul
        final Node<E> l = last;
        //新建一个节点,他的前驱节点为l即之前的尾节点
        final Node<E> newNode = new Node<>(l, e, null);
        //设置当前尾节点为新插入的节点
        last = newNode;
        //如果之前的l节点不存在,说明当前链表没数据,设置头结点为当前节点
        if (l == null)
            first = newNode;
        else
        //如果l节点存在,就将l节点的后继节点设置为当前节点
            l.next = newNode;
        //链表大小+1
        size++;
        modCount++;
    }

最后逐步返回,第一次add的流程就结束了

remove(0bject o)

传对象,删除含有这个对象的数据,可能是多条

public boolean remove(Object o) {
		//对象为null,删除链表中item为null的数据
        if (o == null) {
        	//遍历链表
            for (Node<E> x = first; x != null; x = x.next) {
                if (x.item == null) {
                	//数据为null就进行断表删除	
                    unlink(x);
                    return true;
                }
            }
        } else {
        //对象不为null,删除链表中item与传入的o内容相等的数据
            for (Node<E> x = first; x != null; x = x.next) {
                if (o.equals(x.item)) {
                    unlink(x);
                    return true;
                }
            }
        }
        return false;
    }
E unlink(Node<E> x) {
        // assert x != null;
        //将当前node节点的数据、后继、前驱节点分别取出
        final E element = x.item;
        final Node<E> next = x.next;
        final Node<E> prev = x.prev;
		
		//断开前驱节点的连接
		//前驱不存在,说明该节点是头节点,将头结点改为后继节点
        if (prev == null) {
            first = next;
        } else {
        //前驱存在,将前驱节点的后继改为next,并将x的前驱设置为null
            prev.next = next;
            x.prev = null;
        }

		//断开后继节点的连接
		//后继不存在,说明该节点是尾节点,将尾结点改为x的前驱节点
        if (next == null) {
            last = prev;
        } else {
        //后继存在,将后继节点的前驱改为prev,并将x的后继设置为null
            next.prev = prev;
            x.next = null;
        }

        x.item = null;
        size--;
        modCount++;
        return element;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值