欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linkedList中的双向链表JDK1.8

程序员文章站 2022-07-14 08:34:23
...

综述

linkedList是我们经常使用的集合容器之一,其底层数据结构是一个双向链表。但是这个双向链表与教材中的双向链表有所不同。

接下来我们分析这种双向链表的存储结构。

1.linkedList中双向链表的结构

linkedList中的双向链表JDK1.8注意:(1)linkedList中的双向链表没有头指针都是节点;(2)第一个节点的前驱为null,最后一个节点的后驱为null。

下面是大部分教材中的双向链表
linkedList中的双向链表JDK1.8

2.增

执行过程

第一步:
linkedList中的双向链表JDK1.8
第二步:
linkedList中的双向链表JDK1.8
第三步:
linkedList中的双向链表JDK1.8
第四步:
linkedList中的双向链表JDK1.8

源码

下面的源码就是LinkedList(JDK1.8)中新增节点的关键部分源码,其执行过程就是上图中的顺序。

		//succ就是上图中的succ
		void linkBefore(E e, Node<E> succ) {
	        //pred就是上图中的pred
	        final Node<E> pred = succ.prev;
	        //newNode也是
	        //这一行代码就是上图中的第二步
	        final Node<E> newNode = new Node<>(pred, e, succ);
	        //上图中的第三步
	        succ.prev = newNode;
	        //判断是否作为第一个节点加入到双向链表中
	        if (pred == null)
	            first = newNode;
	        else
	        	//上图中的第四步
	            pred.next = newNode;
	        size++;
	        modCount++;
	    }

3.删

执行过程

第一步:
linkedList中的双向链表JDK1.8
第二步:
linkedList中的双向链表JDK1.8
第三步:
linkedList中的双向链表JDK1.8

源码

下面的源码就是LinkedList(JDK1.8)中删除节点的关键部分源码,其执行过程就是上图中的顺序。

		//x是要删除的那个节点
		E unlink(Node<E> x) {
			//element是要删除节点的data部分
	        final E element = x.item;
	        //next就是上图中的next
	        final Node<E> next = x.next;
	        //prev就是上图中的prev
	        final Node<E> prev = x.prev;
	        //判断要删除的节点是否是该双向链表的第一个节点
	        if (prev == null) {
	            first = next;
	        } else {
	        	//这两行代码就是上图中的第二步
	            prev.next = next;
	            x.prev = null;
	        }
	        //判断要删除的节点是否是最后一个节点
	        if (next == null) {
	            last = prev;
	        } else {
	        	//这两行代码就是上图中的第三步
	            next.prev = prev;
	            x.next = null;
	        }
	        //要删除节点的data部分也为null
	        x.item = null;
	        size--;
	        modCount++;
	        return element;
	    }