1.概述

1.1 说明

作者水平有限, 如有错误还望各位指正.

本文源码来自: JDK8.

1.2 简介

LinkedList 是非线程安全的, 允许元素为 null 的双向链表.

底层结构是链表, 增删效率较高, 随机访问元素效率较差, 适用于增删为主的场景 (和 ArrayList 相反).

1.3 继承关系

因部分类/接口在 ArrayList 中介绍过了, 本文不再介绍.

AbstractSequentialList: 和 AbstractList 相似, 不再过多介绍.

Deque: 提供了双向链表操作.

2. 源码

2.1 字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* 元素数量
*/
transient int size = 0;

/**
* 头节点
*/
transient Node<E> first;

/**
* 尾节点
*/
transient Node<E> last;

/**
* 具体节点, 内部类
* 用于存储元素
*/
private static class Node<E> {
// 该节点的元素
// 可以为 null
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;
}
}

2.2 构造方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 创建一个空链表
* 因为没有具体数据, 所以并不需要做什么
*/
public LinkedList() {
}

/**
* 调用 addAll() 将 c 中的元素加入链表中
*/
public LinkedList(Collection<? extends E> c) {
// 这个 this() 是为了可维护性.
// 如果不加默认调用 super()
this();
addAll(c);
}

2.3 辅助方法

因增删改查等主要方法都会调用这几个辅助方法, 因此先介绍一下.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
/**
* 在头部添加一个元素.
*/
private void linkFirst(E e) {

final Node<E> f = first;
final Node<E> newNode = new Node<>(null, e, f);
first = newNode;
// 如果原来是空链表, 将尾节点也指向加入的元素
if (f == null)
last = newNode;
else
// 不是空链表, 更新节点
f.prev = newNode;
size++;
// 结构性修改次数+1
// 用于判断是否存在并发操作
// ArrayList 中有相关介绍
modCount++;
}

/**
* 在尾部添加一个元素.
* 和上一个方法相似
*/
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}

/**
* 在非空节点 succ 之前插入元素
*/
void linkBefore(E e, Node<E> succ) {
// 保证 succ 非空
final Node<E> pred = succ.prev;
final Node<E> newNode = new Node<>(pred, e, succ);
succ.prev = newNode;
// succ 前一个节点为空, 表示 succ 是头节点, 更新头节点为 newNode
if (pred == null)
first = newNode;
else // 更新节点信息.
pred.next = newNode;
size++;
modCount++;
}

/**
* 删除链表的第一个节点, 返回元素值
* 该节点非空
*/
private E unlinkFirst(Node<E> f) {
// assert f == first && f != null;
final E element = f.item;
final Node<E> next = f.next;
f.item = null;
f.next = null; // 置为 null, 方便 GC 回收垃圾
first = next;
// 如果链表就这一个元素, 将链表置为空链表
if (next == null)
last = null;
else
next.prev = null;
size--;
modCount++;
return element;
}

/**
* 删除最后一个节点, 返回元素值
*/
private E unlinkLast(Node<E> l) {
// assert l == last && l != null;
final E element = l.item;
final Node<E> prev = l.prev;
l.item = null;
l.prev = null; // 方便 GC 回收
last = prev;
// 如果就这一个元素
if (prev == null)
first = null;
else
prev.next = null;
size--;
modCount++;
return element;
}

/**
* 删除非空节点 x, 返回元素值
*/
E unlink(Node<E> x) {
// assert x != null;
final E element = x.item;
final Node<E> next = x.next;
final Node<E> prev = x.prev;
// 如果 x 是头节点
if (prev == null) {
first = next;
} else {
prev.next = next;
x.prev = null;
}
// 如果 x 是尾节点
if (next == null) {
last = prev;
} else {
next.prev = prev;
x.next = null;
}

x.item = null;
size--;
modCount++;
return element;
}


/**
* 返回指定位置的节点(非空).
*/
Node<E> node(int index) {
// assert isElementIndex(index);
// 一种优化, 看指定位置属于前半段还是后半段
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}

/**
* 位置索引检查, 超界抛 IndexOutOfBoundsException
* 用于 add 和 迭代器
*/
private void checkPositionIndex(int index) {
if (!isPositionIndex(index))
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

/**
* 位置索引检查
* @return 有效索引: true, 否则: false
*/
private boolean isPositionIndex(int index) {
return index >= 0 && index <= size;
}

/**
* 元素索引检查
* 一般用于查找
*/
private void checkElementIndex(int index) {
if (!isElementIndex(index))
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

/**
* 说明参数是否是现有元素的索引
*/
private boolean isElementIndex(int index) {
return index >= 0 && index < size;
}

2.4 增

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/**
* 在链表头部插入元素
*
* @param e 要添加的元素
*/
public void addFirst(E e) {
linkFirst(e);
}

/**
* 在链表尾部插入元素
*
* 等价于 add()
*
* @param e 要添加的元素
*/
public void addLast(E e) {
linkLast(e);
}

/**
* 插入指定元素,返回操作结果,默认添加到末尾作为最后一个元素
*
* @param e 要添加到此链表中的元素
* @return true 如果添加成功
*/
public boolean add(E e) {
linkLast(e);
return true;
}


/**
* 在此链表的指定位置插入元素
*
* @param index 要插入指定元素的索引
* @param element 要插入的元素
* @throws IndexOutOfBoundsException 索引超界
*/
public void add(int index, E element) {
// 索引检查
checkPositionIndex(index);

if (index == size)
linkLast(element);
else
linkBefore(element, node(index));
}

/**
* 将集合插入到链表尾部
*
* @param c 包含要添加到此链表中的元素的集合
* @return {@code true} 如果此链表因调用而更改
* @throws NullPointerException 如果指定的集合是空的
*/
public boolean addAll(Collection<? extends E> c) {
return addAll(size, c);
}

/**
* 将集合从指定位置开始插入
*
* @param index 在哪个索引处前插入指定集合中的第一个元素
* @param c 包含要添加到此链表中的元素的集合
* @return {@code true} 如果该链表因调用而更改
* @throws IndexOutOfBoundsException {@inheritDoc}
* @throws NullPointerException 如果指定的集合是空的
*/
public boolean addAll(int index, Collection<? extends E> c) {
//检查索引是否正确(0<=index<=size)
checkPositionIndex(index);

Object[] a = c.toArray();
int numNew = a.length;
//若没有元素要添加,直接返回false
if (numNew == 0)
return false;
//succ指向当前需要插入节点的位置,pred指向其前一个节点
Node<E> pred, succ;
//如果是在末尾开始添加,当前节点后一个节点初始化为null,前一个节点为尾节点
if (index == size) {
succ = null;
pred = last;
} else { //如果不是从末尾开始添加,当前位置的节点为指定位置的节点,前一个节点为要添加的节点的前一个节点
succ = node(index);
pred = succ.prev;
}
//遍历数组并添加到列表中
for (Object o : a) {
@SuppressWarnings("unchecked") E e = (E) o;
//将元素值e,前继节点pred“封装”为一个新节点newNode
Node<E> newNode = new Node<>(pred, e, null);
//如果原链表为null,则新插入的节点作为链表首节点
if (pred == null)
first = newNode;
else
pred.next = newNode; //如果存在前节点,前节点会向后指向新加的节点
pred = newNode; //pred指针向后移动,指向下一个需插入节点位置的前一个节点
}
//如果是从最后开始添加的,则最后添加的节点成为尾节点
if (succ == null) {
last = pred;
} else {
pred.next = succ; //如果不是从最后开始添加的,则最后添加的节点向后指向之前得到的后续第一个节点
succ.prev = pred; //当前,后续的第一个节点也应改为向前指向最后一个添加的节点
}

size += numNew;
modCount++;
return true;
}

接下来的方法都是 Deque 的添加操作, 几乎都是调用的上面的方法不再过多叙述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
   
/**
* 和 add(e) 一样
*/
public boolean offer(E e) {
return add(e);
}

/**
* 从链表头部插入元素
*
* @param e 要插入的元素
* @return 始终返回 true
* @since 1.6
*/
public boolean offerFirst(E e) {
addFirst(e);
return true;
}

/**
* 从尾部插入元素
*
* @param e 要插入的元素
* @return 始终返回 true
* @since 1.6
*/
public boolean offerLast(E e) {
addLast(e);
return true;
}

/**
* 等价于 addFirst
* 不能说是完全一样, 只能说是一模一样
*
* @param e the element to push
* @since 1.6
*/
public void push(E e) {
addFirst(e);
}

2.5 删

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/**
* 从链表头部删除一个节点
*
* @return 删除的元素
* @throws NoSuchElementException 链表为空
*/
public E removeFirst() {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return unlinkFirst(f);
}

/**
* 从链表尾部删除一个节点, 链表为空抛出异常
*/
public E removeLast() {
final Node<E> l = last;
if (l == null)
throw new NoSuchElementException();
return unlinkLast(l);
}

/**
* 删除指定元素
* 如果有多个只删除第一个
*
* @param o 要从链表重视删除的元素
* @return {@code true} 如果链表包含此元素.
*/
public boolean remove(Object o) {
// 元素是否为 null
if (o == null) {
// 遍历
for (Node<E> x = first; x != null; x = x.next) {
if (x.item == null) {
unlink(x);
return true;
}
}
} else {
for (Node<E> x = first; x != null; x = x.next) {
if (o.equals(x.item)) {
unlink(x);
return true;
}
}
}
return false;
}

/**
* 删除指定位置的元素
*
* @param index 要删除的元素的索引
* @return 被删除的元素
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E remove(int index) {
// 检查索引
checkElementIndex(index);
// 1. 获取指定位置的节点
// 2. 调用删除节点函数
return unlink(node(index));
}

/**
* 从链表头部删除一个节点.
* 返回删除的元素
* 和 removeFirst 的区别: 链表为空 poll 返回null, removeFirst 抛出异常
*
* @return 链表为空返回 null, 否则返回删除的元素
* @since 1.5
*/
public E poll() {
final Node<E> f = first;
return (f == null) ? null : unlinkFirst(f);
}

/**
* 从链表头部删除一个元素
* 同 removeFirst
*/
public E remove() {
return removeFirst();
}

/**
* 删除第一个元素
* 同 removeFirst
*/
public E pop() {
return removeFirst();
}

/**
* 删除链表的第一个节点(如果有), 返回其存储的元素
* 如果链表为空, 返回 null
*/
public E pollFirst() {
final Node<E> f = first;
return (f == null) ? null : unlinkFirst(f);
}

/**
* 删除链表的最后一个节点(如果有), 返回其存储的元素
* 如果链表为空, 返回 null
*/
public E pollLast() {
final Node<E> l = last;
return (l == null) ? null : unlinkLast(l);
}

/**
* 删除链表中第一个指定元素, 返回操作结果
*
* @param o 要从链表中删除的元素(如果存在)
* @return {@code true} 如果链表包含此元素
* @since 1.6
*/
public boolean removeFirstOccurrence(Object o) {
return remove(o);
}

/**
* 删除链表中最后一个指定元素, 返回操作结果
*
* @param o 要从链表中删除的元素(如果存在)
* @return {@code true} 如果链表包含此元素
* @since 1.6
*/
public boolean removeLastOccurrence(Object o) {
// 指定元素是否为 null
if (o == null) {
// 从尾查找元素第一次出现的节点
for (Node<E> x = last; x != null; x = x.prev) {
if (x.item == null) {
// 删除该节点
unlink(x);
return true;
}
}
} else {
for (Node<E> x = last; x != null; x = x.prev) {
if (o.equals(x.item)) {
unlink(x);
return true;
}
}
}
return false;
}

2.6 改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 修改指定位置的元素, 返回修改前的值
*
* @param index 要修改的元素的索引
* @param element 要储存在指定位置的元素
* @return 修改前的元素
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E set(int index, E element) {
// 检查索引
checkElementIndex(index);
Node<E> x = node(index);
E oldVal = x.item;
// 修改值
x.item = element;
return oldVal;
}

2.7 查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84

/**
* 获取链表头节点的值
*
* @return 链表头节点的值
* @throws NoSuchElementException 链表为空
*/
public E getFirst() {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return f.item;
}

/**
* 获取链表尾部的值
*/
public E getLast() {
final Node<E> l = last;
if (l == null)
throw new NoSuchElementException();
return l.item;
}

/**
* 获取链表指定位置的元素
*
* @param index 指定位置
* @return 指定位置的元素
* @throws IndexOutOfBoundsException {@inheritDoc} 索引异常
*/
public E get(int index) {
// 判断元素索引
checkElementIndex(index);
return node(index).item;
}

/**
* 获取链表头节点存储的元素, 不会删除节点
*
* @return 头节点的元素, 如果链表为空返回 null
* @since 1.5
*/
public E peek() {
final Node<E> f = first;
return (f == null) ? null : f.item;
}


/**
* 获取链表头节点存储的元素, 不会删除节点
* 链表为空抛出异常
*
* @return 头节点存储的元素
* @throws NoSuchElementException if this list is empty
* @since 1.5
*/
public E element() {
return getFirst();
}

/**
* 返回列表第一个元素, 不删除
* 列表为空返回 null
* @return the first element of this list, or {@code null}
* if this list is empty
* @since 1.6
*/
public E peekFirst() {
final Node<E> f = first;
return (f == null) ? null : f.item;
}

/**
* 返回链表最后一个元素, 不删除
* 链表为空返回 null
* @return the last element of this list, or {@code null}
* if this list is empty
* @since 1.6
*/
public E peekLast() {
final Node<E> l = last;
return (l == null) ? null : l.item;
}

2.8 迭代器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135

/**
* 返回该链表从指定位置开始的迭代器.
* 迭代器是 fail-fast: 创建迭代器之后的任何时候, 链表发生结构性修改后, 迭代器会抛出 ConcurrentModificationException. 面对并发修改时, 迭代器会快速失败.
* 返回的是内部类 ListItr
* @param index 迭代器返回的第一个元素的索引
* @return 此链表 index(包含)之后的所有元素
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public ListIterator<E> listIterator(int index) {
checkPositionIndex(index);
return new ListItr(index);
}

private class ListItr implements ListIterator<E> {
private Node<E> lastReturned;
private Node<E> next;
private int nextIndex;
private int expectedModCount = modCount;

ListItr(int index) {
// assert isPositionIndex(index);
next = (index == size) ? null : node(index);
nextIndex = index;
}

public boolean hasNext() {
return nextIndex < size;
}

public E next() {
checkForComodification();
if (!hasNext())
throw new NoSuchElementException();

lastReturned = next;
next = next.next;
nextIndex++;
return lastReturned.item;
}

public boolean hasPrevious() {
return nextIndex > 0;
}

public E previous() {
checkForComodification();
if (!hasPrevious())
throw new NoSuchElementException();

lastReturned = next = (next == null) ? last : next.prev;
nextIndex--;
return lastReturned.item;
}

public int nextIndex() {
return nextIndex;
}

public int previousIndex() {
return nextIndex - 1;
}

public void remove() {
checkForComodification();
if (lastReturned == null)
throw new IllegalStateException();

Node<E> lastNext = lastReturned.next;
unlink(lastReturned);
if (next == lastReturned)
next = lastNext;
else
nextIndex--;
lastReturned = null;
expectedModCount++;
}

public void set(E e) {
if (lastReturned == null)
throw new IllegalStateException();
checkForComodification();
lastReturned.item = e;
}

public void add(E e) {
checkForComodification();
lastReturned = null;
if (next == null)
linkLast(e);
else
linkBefore(e, next);
nextIndex++;
expectedModCount++;
}

public void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (modCount == expectedModCount && nextIndex < size) {
action.accept(next.item);
lastReturned = next;
next = next.next;
nextIndex++;
}
checkForComodification();
}

final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}

/**
* 反向迭代器
*/
public Iterator<E> descendingIterator() {
return new DescendingIterator();
}

/**
* 重写了 next remove 等方法, 使其按照从尾向前的顺序迭代
*/
private class DescendingIterator implements Iterator<E> {
private final ListItr itr = new ListItr(size());
public boolean hasNext() {
return itr.hasPrevious();
}
public E next() {
return itr.previous();
}
public void remove() {
itr.remove();
}
}

2.9 序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

/**
* 序列化
*/
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
// 默认序列化
s.defaultWriteObject();

// 写入元素数量
s.writeInt(size);

// 序列化所有元素
for (Node<E> x = first; x != null; x = x.next)
s.writeObject(x.item);
}

/**
* 反序列化
*/
@SuppressWarnings("unchecked")
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
// 默认反序列化
s.defaultReadObject();

// 读取元素数量
int size = s.readInt();

// 遍历链表, 读取所有元素并尾部插入
for (int i = 0; i < size; i++)
linkLast((E)s.readObject());
}

2.10 其他API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/**
* 判断链表是否包含指定元素
*
* @param o 要测试的元素
* @return 如果包含返回 true
*/
public boolean contains(Object o) {
return indexOf(o) != -1;
}

/**
* 查询链表中首次出现指定元素的下标
* 如果链表中没有指定元素, 返回 -1
* 指定元素可以为 null
*
* @param o 指定元素
* @return 没有此元素, 返回 -1
* 有则返回第一次出现的下标
*/
public int indexOf(Object o) {
int index = 0;
// 元素是否为null
if (o == null) {
// 遍历
for (Node<E> x = first; x != null; x = x.next) {
if (x.item == null)
return index;
index++;
}
} else {
for (Node<E> x = first; x != null; x = x.next) {
if (o.equals(x.item))
return index;
index++;
}
}
return -1;
}
/**
* 逆序获取指定元素首次出现的位置
* 上个方法反过来
*/
public int lastIndexOf(Object o) {
int index = size;
if (o == null) {
// 遍历链表,逆序查找指定元素
for (Node<E> x = last; x != null; x = x.prev) {
index--;
if (x.item == null)
return index;
}
} else {
for (Node<E> x = last; x != null; x = x.prev) {
index--;
if (o.equals(x.item))
return index;
}
}
return -1;
}

/**
* 返回链表包含的元素数量
*
* @return 元素数量
*/
public int size() {
return size;
}

/**
* 清空链表
*/
public void clear() {
// 遍历链表, 删除所有节点, 方便 GC 回收
for (Node<E> x = first; x != null; ) {
Node<E> next = x.next;
x.item = null;
x.next = null;
x.prev = null;
x = next;
}
// 首尾节点值为 null
first = last = null;
// 元素数量置 0
size = 0;
modCount++;
}

/**
* 父类克隆方法
*/
@SuppressWarnings("unchecked")
private LinkedList<E> superClone() {
try {
return (LinkedList<E>) super.clone();
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
}

/**
* 克隆, 浅拷贝
*
* @return 返回此链表的一个浅拷贝
*/
public Object clone() {
LinkedList<E> clone = superClone();

// 置为空链表
clone.first = clone.last = null;
clone.size = 0;
clone.modCount = 0;

// 添加链表的所有元素
for (Node<E> x = first; x != null; x = x.next)
clone.add(x.item);

return clone;
}

/**
* 返回包含链表所有数据的数组
* 返回的数组是"安全"的, 返回的数组和此链表不存在关联
* 返回类型为 Object[], 使用时可能需要强制转换.
*/
public Object[] toArray() {
// 新开一个大小为 size 的数组
Object[] result = new Object[size];
int i = 0;
// 将链表中的元素存入数组
for (Node<E> x = first; x != null; x = x.next)
result[i++] = x.item;
return result;
}

/**
* 返回指定类型的包含链表所有元素的数组.
*
* @param a 给的数组
* 如果 a 足够大, 将链表元素存入 a 返回, 否则新开一个和 a 类型相同的大小和链表元素个数相同的数组, 将链表元素存入返回.
* @return 包含链表所有元素的数组
* @throws ArrayStoreException 如果指定的类型不是元素类型的父类
* @throws NullPointerException 所给数组为 null
*/
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {
// 所给数组不够大, 新开一个
if (a.length < size)
a = (T[])java.lang.reflect.Array.newInstance(
a.getClass().getComponentType(), size);
int i = 0;
Object[] result = a;
// 遍历链表, 存入元素
for (Node<E> x = first; x != null; x = x.next)
result[i++] = x.item;
// 将 a[size] 置为 null(如果有的话), 对以后确定列表的长度很有用, 但只在调用方知道列表中不包含任何 null 元素时才有用.
if (a.length > size)
a[size] = null;

return a;
}

评论




博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

载入天数...载入时分秒... 本站使用 Volantis 作为主题 鲁ICP备-20012065号