1.LinkedList类定义
1 | public class LinkedList<E> |
- LinkedList 是一个继承于 AbstractSequentialList 的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。
- LinkedList 实现 List 接口,能对它进行队列操作。
- LinkedList 实现 Deque接口,即能将LinkedList当作双端队列使用。
- LinkedList 实现了 Cloneable 接口,即覆盖了函数clone(),能克隆。
- LinkedList 实现 java.io.Serializable 接口,这意味着LinkedList支持序列化,能通过序列化去传输。
- LinkedList 是非同步的。
LinkedList的类图关系:

2.LinkedList数据结构
LinkedList的成员变量很少且只有三个:代表节点个数的 size,前驱pre和后继last。Java中的LinkedList的数据结构是一个双向非循环链表,由内部类Node定义:
1 | private class Node<T> { |
3.构造器
定义一个first,last,以及链表当长度,但是头部和尾部要设置为空。
1 | Node<T> frist; //头部 |
4.LinkedList核心操作:
- add(T e)
- add(int index, T e)
- set(int index, T e)
- get(int index)
- remove(int index)
- remove(T e)
- int size()
- boolean isEmpty()
- forEach(Consumer
action)
1) add(T e)
在末尾添加一个元素
1 |
|
说明:当在末尾添加元素的时候,先要判断尾部元素是否为空,若为空则说明只有一个元素,则直接把该元素放在里面;若尾部元素不为空的,则最后一个元素下一个为此次添加的元素,添加的元素的前驱指向前一个元素,那么此时最后一个元素为刚刚添加进入的。
2) add(int index, T e)
在指定下标 index 位置中添加一个元素
1 | private Node<T> getNode(int index) { |
说明:此时需要进行分段考虑。
- 当 index < 0 或者 index > size 时,则为数组越界
- 当 index = size 时,此时相当于在末尾添加一个元素,在链表当范围之内,所以直接添加进去。
- 最后一种情况就是当在中间元素的时候,此时就比较麻烦,需要改变next和pre的方向。

3) set(int index, T e)
在指定下标 index 位置中设置一个元素,返回旧值
1 | private Node<T> getNode(int index) { |
说明:此时还是需要进行分段讨论
- 当 index < 0 或者 index > size 时,则为数组越界
- 当 index = size 时,此时相当于在末尾设置元素,在链表当范围之内,所以直接添加进去。
- 当在中间设置时,首先设置下标为index的元素oldData为node.data,再将元素e赋值为node.data, 最后返回oldData的值。
4) get(int index)
根据指定下标获取元素
1 |
|
说明:当 0<=index<size时,返回指定下标下的值;其余情况下为数组越界。
5) remove(int index)
根据指定下标 index 删除指定元素,并返回删除的值
1 |
|
说明:此时需要进行分组讨论:
- 当index < 0 或者 index >= size时,此时为数组越界
- 当 index = 0时,此时只有一个空链表。如图所示,然后

- 中间元素的删除:

5) boolean remove(T e)
删除指定的值,并返回是否删除成功
1 |
|
6) int size()
获取列表大小
1 |
|
7) boolean isEmpty()
判断是否为空
1 |
|
8) forEach(Consumer
遍历所有元素
1 |
|
5.总结
LinkedList使用了循环双向链表数据结构进行实现,通过改动指针的方向来添加或删除某个元素,但是读的速度很慢,删除很方便。
6.源代码
1 | package com.tongcaipay.merchant.apply.study; |


