双向链表程序实现的分析

对双向链表的浅理解随记
java源码:

 //内部类,把双向链表中的元素定义为:prev、elemen、next三个部分
private static class Node> {
        E item;
        Node> next;
        Node> prev;

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


//LinkedList中创建双向链表的方法
void linkLast(E e) {
        final Node> l = last;
        final Node> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    }

调LinkedList.add(),传入“a”、“b”、“c”

      List list=new java.util.LinkedList();
        list.add("a");
        list.add("b");
        list.add("c");


执行过程及分析
1、传入“a"时,第一个元素传入时,fast、last为null


void linkLast(E e) {
    //l=last=null
        final Node l = last;
    
    //newNode为(null,"a",null),假设地址为ox213
        final Node newNode = new Node<>(l, e, null);
    
    //last指向newNode,last存放ox123
        last = newNode;
    
    //此时l=null,first指向newNode,存放内存地址ox123
        if (l == null)
            first = newNode;
        else
            l.next = newNode;

    //元素个数为1
        size++;
        modCount++;
    }


2、传入“b"时,fast、last均存放前一个元素的内存地址ox123


void linkLast(E e) {
    //l=last=ox123
        final Node l = last;
    
    //newNode为(ox123,"b",null),假设地址为ox456
        final Node newNode = new Node<>(l, e, null);
    
    //last指向newNode,last存放ox456
        last = newNode;
    
    //此时l=ox123,l.next(即第一个元素的next部分)指向new Node,
    //存放内存地址ox456
        if (l == null)
            first = newNode;
        else
            l.next = newNode;

    //元素个数为1
        size++;
        modCount++;
    }

此时双向链表中的元素为
(null,"a",ox456)
(ox123,"b",null)

第一个元素的next部分指向第二个元素,存放第二个元素的内存地址
第二个元素的prev部分指向第一个元素,存放第一个元素的内存地址

存入第三个元素也是同理,利用l、first、last三个局部变量对内存地址进行替换
赋值给每个元素的prev、next部分