博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LinkedList<E>源码分析
阅读量:5130 次
发布时间:2019-06-13

本文共 2755 字,大约阅读时间需要 9 分钟。

LinkedList的数据结构就是双向链表,如下所示:

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; } }

 

构造器:

transient int size = 0;//数据个数transient Node
first;//表示链表的第一个节点transient Node
last;//表示链表的最后一个节点public LinkedList() {} public LinkedList(Collection
c) {
//用于整合Collection类型的数据 this(); addAll(c);}

 

add:

public boolean add(E e) {        linkLast(e);        return true; } void linkLast(E e) {
//采用的是尾插法 final Node
l = last; final Node
newNode = new Node<>(l, e, null);//新节点的前驱指向last的地址,后继为null,                                 //所以说这是一个双向链表,但不是循环的,循环的话,后继指向头节点 last = newNode;//让last指向新节点,也就说这个新节点是链表的最后一个元素 if (l == null)//当第一次添加时,first,last都是null,如果last是null,表明这是一个空链表 first = newNode;//就让新节点指向first,现在first和last都是同一个节点 else l.next = newNode;//当在添加数据时,就让老链表的最后一个节点的后继指向新节点(那个节点本来是null的) size++; //长度加1 modCount++; /** 总结: 新建一个节点,让新节点的前驱指向老链表的最后一个节点 让老链表的最后一个节点的后继指向新节点 让新节点变成链表的最后一个节点 长度加1 第一个节点前驱为null,最后一个节点后继为null */ }

 

get:

public E get(int index) {        checkElementIndex(index);//检查一下索引是否在0到size的范围内        return node(index).item;    }Node
node(int index) { // assert isElementIndex(index); if (index < (size >> 1)) {
//看看索引的位置是在链表的前半部分还是后半部分,决定正着搜索或倒着搜索,找到后返回就行啦 Node
x = first; for (int i = 0; i < index; i++)//在这里看到链表是从0开始的 x = x.next; return x; } else { Node
x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; } }

 

remove:

public E remove(int index) {        checkElementIndex(index);//先检查一下索引        return unlink(node(index));    }//先拿着索引找到这个节点E unlink(Node
x) { // assert x != null; final E element = x.item;//节点的元素 final Node
next = x.next;//节点的后继 final Node
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; } x.item = null; size--; modCount++; return element; }

 

转载于:https://www.cnblogs.com/wwzyy/p/6130442.html

你可能感兴趣的文章
java可重入锁reentrantlock
查看>>
浅谈卷积神经网络及matlab实现
查看>>
struts2学习(9)struts标签2(界面标签、其他标签)
查看>>
Android 导入jar包 so模块--导入放置的目录
查看>>
解决ajax请求cors跨域问题
查看>>
Android Studio
查看>>
zz 圣诞丨太阁所有的免费算法视频资料整理
查看>>
【大数模板】C++大数类 大数模板
查看>>
【123】
查看>>
《收获,不止Oracle》pdf
查看>>
用户权限设置
查看>>
java 之equals与"=="的区别
查看>>
LinkedList<E>源码分析
查看>>
学习微软 Excel 2002 VBA 编程和XML,ASP技术
查看>>
游戏开发常用算法
查看>>
Real-Time Rendering 笔记
查看>>
如何理解HTML结构的语义化
查看>>
Intellij IDEA(eclipse设置)常用快捷键
查看>>
深入理解Java:注解(Annotation)基本概念
查看>>
NAT基本原理
查看>>