LinkList及其源码解析

Posted houchen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LinkList及其源码解析相关的知识,希望对你有一定的参考价值。

1.链表介绍

链表是一种物理单元上非连续,非顺序的存储结构。链表由一系列的姐点组成,结点可以在运行时
动态生成。每个结点包含两个部分,一个是存储数据元素的数据域,一个是存储下一个结点的指针域

双链表是链表的一种,每个结点既有前驱指针,也有后驱指针

2.LinkList 源码分析
1)构造方法
public LinkList(){
}

public LinkedList(Collection <? extend E> c){
this();
addAll(c)
}

2) 元素插入
第一种插入方式
public boolean add(E e) {
linkLast(e);
return true;
}

//在链表的最后一个位置插入结点
void linkLast(E e) {
//
final Node<E> l = last;
//构造一个新结点,(l(前驱结点), e(新建结点的元素), null(后继结点));
final Node<E> newNode = new Node<>(l, e, null);
设置新节点是尾结点
last = newNode;
判断链表是否有结点
if (l == null)

first = newNode;
else
//设置尾结点的后继结点是新建的节点
l.next = newNode;
size++;
modCount++;
}

// 链表结点的定义类
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;
}
}


第二种插入方式
public boolean add(E e。int index) {
}


3)元素删除
public E remove(){
}

public E remove(int index){
}


4) 查找方法
public E get(int index) {
checkElementIndex(index);
return node(index).item;
}


5)链表的遍历
LinkedList的迭代器
Iterator<String> iterator = list.iterator();

=================================================
3 主要方法
1)添加元素到LinkedList
LinkedList提供了多个添加元素的方法:
●boolean add(E e)
在链表尾部添加一个元素,如果成功,返回true,否则返回false。

●void addFirst(E e)
在链表头部插入一个元素。

●addLast(E e)
在链表尾部添加一个元素。

●void add(int index, E element)
在指定位置插入一个元素。

 

2)从LinkedList中删除元素
LinkedList提供了多个删除元素的方法:

● E remove(int index)
从当前链表中移除指定位置的元素。

● E removeFirst()
从当前链表中移除第一个元素

● E removeLast()
从当前链表中移除最后一个元素。

● E remove()
从当前链表中移除第一个元素,同removeLast()相同。

 

3)从LinkedList中获取元素
LinkedList提供了多个获取元素的方法:

● E get(int index)
从当前链表中获取指定位置的元素。

● E getFirst()
从当前链表中获取第一个元素。

● E getLast()
从当前链表中获取最后一个元素。

 

4)LinkedList的遍历方法
Iterator it =list.lterator();
while(it.hasNext()){
E e=it.next();
it=it.next();
}

foreach语句效率最高,其次是迭代器,效率最差的是for循环


总结:inkedList存储元素的数据结构是双向链表结构,由存储元素的结点连接而成,
每一个节点都包含前一个节点的引用,后一个节点的引用和节点存储的值。

以上是关于LinkList及其源码解析的主要内容,如果未能解决你的问题,请参考以下文章

ArrayList 及其源码解析

52.otto 源码解析

HandlerThread 的使用及其源码完全解析

通过源码解析 Node.js 中高效的 timer

第45讲:Scala中Context Bounds代码实战及其在Spark中的应用源码解析

java 17 - 6 TreeSet集合及其add()方法的源码解析