LinkedLis的数据结构——双向链表

数据结构 专栏收录该内容
11 篇文章 1 订阅

综述

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

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

1.linkedList中双向链表的结构

在这里插入图片描述注意:(1)linkedList中的双向链表没有头指针都是节点;(2)第一个节点的前驱为null,最后一个节点的后驱为null。

下面是大部分教材中的双向链表
在这里插入图片描述

2.增

执行过程

第一步:
在这里插入图片描述
第二步:
在这里插入图片描述
第三步:
在这里插入图片描述
第四步:
在这里插入图片描述

源码

下面的源码就是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)中删除节点的关键部分源码,其执行过程就是上图中的顺序。

		//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;
	    }
  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值