# LinkedList åºæ¬ç¤ºä¾åæºç è§£æ
### ä¸ãJavaDoc ç®ä»
1. **LinkedListååé¾è¡¨ï¼å®ç°äºListç ååé忥å£ï¼å®ç°äºæælistå¯éæ©æ§æä½ï¼å
许åå¨ä»»ä½å
ç´ (å
æ¬nullå¼)**
2. ææçæä½é½å¯ä»¥è¡¨ç°ä¸ºååæ§çï¼éåçæ¶åä¼ä»é¦é¨å°å°¾é¨è¿è¡éåï¼ç´å°æ¾å°æè¿çå
ç´ ä½ç½®
3. **注æè¿ä¸ªå®ç°ä¸æ¯çº¿ç¨å®å
¨ç,** 妿å¤ä¸ªçº¿ç¨å¹¶å访é®é¾è¡¨ï¼å¹¶ä¸è³å°å
¶ä¸çä¸ä¸ªçº¿ç¨ä¿®æ¹äºé¾è¡¨çç»æï¼é£ä¹è¿ä¸ªé¾è¡¨å¿
é¡»è¿è¡å¤é¨å éã(ç»æåçæä½æçæ¯ä»»ä½æ·»å æè
å é¤è³å°ä¸ä¸ªå
ç´ çæä½ï¼ä»
ä»
对已æå
ç´ çå¼è¿è¡ä¿®æ¹ä¸æ¯ç»æåçæä½)ã
4. **List list = Collections.synchronizedList(new LinkedList(â¦)),**å¯ä»¥ç¨è¿ç§é¾è¡¨ååæ¥è®¿é®ï¼ä½æ¯æå¥½å¨åå»ºçæ¶é´å°±è¿æ ·åï¼é¿å
æå¤çé忥坹é¾è¡¨ç访é®
5. è¿ä»£å¨è¿åçiterators å listIteratoræ¹æ³ä¼é æ**fail-fast**æºå¶ï¼å¦æé¾è¡¨å¨çæè¿ä»£å¨ä¹åè¢«ç»æåçä¿®æ¹äºï¼**é¤äºä½¿ç¨iteratorç¬æçremoveæ¹æ³å¤ï¼é½ä¼æåºå¹¶åä¿®æ¹çå¼å¸¸ã**å æ¤ï¼å¨é¢å¯¹å¹¶åä¿®æ¹çæ¶åï¼è¿ä¸ªè¿ä»£å¨è½å¤å¿«é失败ï¼ä»èé¿å
éç¡®å®æ§çé®é¢
### äºãLinkedList ç»§æ¿æ¥å£åå®ç°ç±»ä»ç»
**java.util.LinkedList** ç»§æ¿äº **AbstractSequentialList** å¹¶å®ç°äº**List , Deque , Cloneable** æ¥å£ï¼ä»¥å**Serializable** æ¥å£
```java
public class LinkedList
extends AbstractSequentialList
implements List, Deque, Cloneable, java.io.Serializable {}
```
ç±»ä¹é´çç»§æ¿ä½ç³»å¦ä¸ï¼

ä¸é¢å°±å¯¹ç»§æ¿æ ä¸çé¨åèç¹è¿è¡å¤§è´ä»ç»ï¼
> AbstractSequentialList ä»ç»ï¼
> è¿ä¸ªæ¥å£æ¯Listä¸ç³»ååç±»æ¥å£çæ ¸å¿æ¥å£ï¼ä»¥æ±æå¤§é度çåå°å®ç°æ¤æ¥å£çå·¥ä½éï¼ç±é¡ºåºè®¿é®æ°æ®åå¨(ä¾å¦é¾æ¥é¾è¡¨)æ¯æã对äºéæºè®¿é®çæ°æ®(忝æ°ç»)ï¼AbstractList åºè¯¥ä¼å
被使ç¨è¿ä¸ªæ¥å£å¯ä»¥è¯´æ¯ä¸AbstractListç±»ç¸åçï¼å®å®ç°äºéæºè®¿é®æ¹æ³ï¼æä¾äºget(int index),set(int index,E element), add(int index,E element) and remove(int index)æ¹æ³
>
> 对äºç¨åºåæ¥è¯´ï¼
>
> è¦å®ç°ä¸ä¸ªå表ï¼ç¨åºååªéè¦æ©å±è¿ä¸ªç±»å¹¶ä¸æä¾listIterator å sizeæ¹æ³å³å¯ã
> 对äºä¸å¯ä¿®æ¹çå表æ¥è¯´ï¼ ç¨åºåéè¦å®ç°å表è¿ä»£å¨ç hasNext(), next(), hasPrevious(),
> previous å index æ¹æ³
> AbstractList ä»ç»ï¼
>
> è¿ä¸ªæ¥å£ä¹æ¯Listç»§æ¿ç±»å±æ¬¡çæ ¸å¿æ¥å£ï¼ä»¥æ±æå¤§é度çåå°å®ç°æ¤æ¥å£çå·¥ä½éï¼ç±é¡ºåºè®¿é®
> æ°æ®åå¨(ä¾å¦é¾æ¥é¾è¡¨)æ¯æã对äºé¡ºåºè®¿é®çæ°æ®(忝é¾è¡¨)ï¼AbstractSequentialList åºè¯¥ä¼å
被使ç¨ï¼
> 妿éè¦å®ç°ä¸å¯ä¿®æ¹çlistï¼ç¨åºåéè¦æ©å±è¿ä¸ªç±»ï¼listéè¦å®ç°get(int) æ¹æ³åList.size()æ¹æ³
> 妿éè¦å®ç°å¯ä¿®æ¹çlistï¼ç¨åºåå¿
é¡»é¢å¤éåset(int,Object) set(int,E)æ¹æ³(å¦å伿åº
> UnsupportedOperationExceptionçå¼å¸¸)ï¼å¦ælistæ¯å¯å大å°çï¼ç¨åºåå¿
é¡»é¢å¤éåadd(int,Object) , add(int, E) and remove(int) æ¹æ³
> AbstractCollection ä»ç»ï¼
>
> è¿ä¸ªæ¥å£æ¯Collectionæ¥å£çä¸ä¸ªæ ¸å¿å®ç°ï¼å°½éåå°å®ç°æ¤æ¥å£æéçå·¥ä½é
> 为äºå®ç°ä¸å¯ä¿®æ¹çcollectionï¼ç¨åºååºè¯¥ç»§æ¿è¿ä¸ªç±»å¹¶æä¾å¢iteratoråsize æ¹æ³
> 为äºå®ç°å¯ä¿®æ¹çcollectionï¼ç¨åºå¢éè¦é¢å¤éåç±»çaddæ¹æ³ï¼iteratoræ¹æ³è¿åçIteratorè¿ä»£å¨ä¹å¿
é¡»å®ç°removeæ¹æ³
### ä¸ãLinkedList åºæ¬æ¹æ³ä»ç»
ä¸é¢çå®äºLinkedList çç»§æ¿ä½ç³»ä¹åï¼æ¥ççLinkedListçåºæ¬æ¹æ³è¯´æ
```javascript
æ·»å
add():
----> 1. add(E e) : ç´æ¥å¨'æ«å°¾'夿·»å å
ç´
----> 2. add(int index,E element) : å¨'æå®ç´¢å¼å¤æ·»'å å
ç´
----> 3. addAll(Collections extends E> c) : å¨'æ«å°¾'夿·»å ä¸ä¸ªcollectionéå
----> 4. addAll(int index,Collections extends E> c)ï¼å¨'æå®ä½ç½®'æ·»å ä¸ä¸ªcollectionéå
----> 5. addFirst(E e): å¨'头é¨'æ·»å æå®å
ç´
----> 6. addLast(E e): å¨'å°¾é¨'æ·»å æå®å
ç´
offer():
----> 1. offer(E e)ï¼ å¨é¾è¡¨'æ«å°¾'æ·»å å
ç´
----> 2. offerFirst(E e): å¨'é¾è¡¨å¤´'æ·»å æå®å
ç´
----> 3. offerLast(E e): å¨'é¾è¡¨å°¾'æ·»å æå®å
ç´
push(E e): å¨'头é¨'åå
¥å
ç´
ç§»é¤
poll()ï¼
----> 1. poll(): 访é®å¹¶ç§»é¤'é¦é¨'å
ç´
----> 2. pollFirst(): 访é®å¹¶ç§»é¤'é¦é¨'å
ç´
----> 3. pollLast(): 访é®å¹¶ç§»é¤'å°¾é¨'å
ç´
pop(): ä»å表代表çå æ ä¸å¼¹åºå
ç´ ï¼ä»'头é¨'å¼¹åº
remove():
----> 1. remove(): ç§»é¤å¹¶è¿å'é¦é¨'å
ç´
----> 2. remove(int index) : ç§»é¤'æå®ç´¢å¼'å¤çå
ç´
----> 3. remove(Object o): ç§»é¤æå®å
ç´
----> 4. removeFirst(): ç§»é¤å¹¶è¿å'第ä¸ä¸ª'å
ç´
----> 5. removeFirstOccurrence(Object o): ä»å¤´å°å°¾éåï¼ç§»é¤'ç¬¬ä¸æ¬¡'åºç°çå
ç´
----> 6. removeLast(): ç§»é¤å¹¶è¿å'æåä¸ä¸ª'å
ç´
----> 7. removeLastOccurrence(Object o): ä»å¤´å°å°¾éåï¼ç§»é¤'æå䏿¬¡'åºç°çå
ç´
clear(): æ¸
空ææå
ç´
访é®
peek():
----> 1. peek(): åªè®¿é®ï¼ä¸ç§»é¤'é¦é¨'å
ç´
----> 2. peekFirst(): åªè®¿é®ï¼ä¸ç§»é¤'é¦é¨'å
ç´ ï¼å¦æé¾è¡¨ä¸å
å«ä»»ä½å
ç´ ï¼åè¿ånull
----> 3. peekLast(): åªè®¿é®ï¼ä¸ç§»é¤'å°¾é¨'å
ç´ ï¼å¦æé¾è¡¨ä¸å
å«ä»»ä½å
ç´ ï¼è¿ånull
element(): åªè®¿é®ï¼ä¸ç§»é¤'头é¨'å
ç´
get():
----> 1. get(int index): è¿å'æå®ç´¢å¼'å¤çå
ç´
----> 2. getFirst(): è¿å'第ä¸ä¸ª'å
ç´
----> 3. getLast(): è¿å'æåä¸ä¸ª'å
ç´
indexOf(Object o): æ£ç´¢æä¸ªå
ç´ 'ç¬¬ä¸æ¬¡'åºç°æå¨çä½ç½®
LastIndexOf(Object o): æ£ç´¢æä¸ªå
ç´ 'æå䏿¬¡'åºç°çä½ç½®
å
¶ä»
clone() : è¿åä¸ä¸ªé¾è¡¨çæ·è´ï¼è¿åå¼ä¸ºObject ç±»å
contains(Object o): 夿é¾è¡¨æ¯å¦å
å«æä¸ªå
ç´
descendingIterator(): è¿åä¸ä¸ªè¿ä»£å¨ï¼éé¢çå
ç´ æ¯ååè¿åç
listIterator(int index) : 卿å®ç´¢å¼å¤å建ä¸ä¸ª'ååéåè¿ä»£å¨'
set(int index, E element): æ¿æ¢æä¸ªä½ç½®å¤çå
ç´
size() : è¿åé¾è¡¨çé¿åº¦
spliterator(): å建ä¸ä¸ªåæç»å®å¹¶å¿«é失败çå
ç´
toArray(): å°é¾è¡¨è½¬å为æ°ç»è¿å
```
### åãLinkedList åºæ¬æ¹æ³ä½¿ç¨
å¦ä»¥è´ç¨ï¼çæäºä¸é¢åºæ¬æ¹æ³ä¹åï¼æ¥ç®ååä¸ä¸ªdemoæµè¯ä¸ä¸ä¸é¢çæ¹æ³ï¼
```java
/**
* æ¤æ¹æ³æè¿°
* LinedList éåçåºæ¬ä½¿ç¨
*/
public class LinkedListTest {
public static void main(String[] args) {
LinkedList list = new LinkedList<>();
list.add("111");
list.add("222");
list.add("333");
list.add(1,"123");
// åå«å¨å¤´é¨å尾鍿·»å å
ç´
list.addFirst("top");
list.addLast("bottom");
System.out.println(list);
// æ°ç»å
é
Object listClone = list.clone();
System.out.println(listClone);
// å建ä¸ä¸ªé¦å°¾äºæ¢çè¿ä»£å¨
Iterator it = list.descendingIterator();
while (it.hasNext()){
System.out.print(it.next() + " ");
}
System.out.println();
list.clear();
System.out.println("list.contains('111') ? " + list.contains("111"));
Collection collec = Arrays.asList("123","213","321");
list.addAll(collec);
System.out.println(list);
System.out.println("list.element = " + list.element());
System.out.println("list.get(2) = " + list.get(2));
System.out.println("list.getFirst() = " + list.getFirst());
System.out.println("list.getLast() = " + list.getLast());
// æ£ç´¢æå®å
ç´ åºç°çä½ç½®
System.out.println("list.indexOf(213) = " + list.indexOf("213"));
list.add("123");
System.out.println("list.lastIndexOf(123) = " + list.lastIndexOf("123"));
// å¨é¦é¨å尾鍿·»å å
ç´
list.offerFirst("first");
list.offerLast("999");
System.out.println("list = " + list);
list.offer("last");
// åªè®¿é®ï¼ä¸ç§»é¤æå®å
ç´
System.out.println("list.peek() = " + list.peek());
System.out.println("list.peekFirst() = " + list.peekFirst());
System.out.println("list.peekLast() = " + list.peekLast());
// 访é®å¹¶ç§»é¤å
ç´
System.out.println("list.poll() = " + list.poll());
System.out.println("list.pollFirst() = " + list.pollFirst());
System.out.println("list.pollLast() = " + list.pollLast());
System.out.println("list = " + list);
// ä»é¦é¨å¼¹åºå
ç´
list.pop();
// åå
¥å
ç´
list.push("123");
System.out.println("list.size() = " + list.size());
System.out.println("list = " + list);
// removeæä½
System.out.println(list.remove());
System.out.println(list.remove(1));
System.out.println(list.remove("999"));
System.out.println(list.removeFirst());
System.out.println("list = " + list);
list.addAll(collec);
list.addFirst("123");
list.addLast("123");
System.out.println("list = " + list);
list.removeFirstOccurrence("123");
list.removeLastOccurrence("123");
list.removeLast();
System.out.println("list = " + list);
list.addFirst("top");
list.addLast("bottom");
list.set(2,"321");
System.out.println("list = " + list);
System.out.println("--------------------------");
// å建ä¸ä¸ªlistçååé¾è¡¨
ListIterator listIterator = list.listIterator();
while(listIterator.hasNext()){
// ç§»å°listçæ«ç«¯
System.out.println(listIterator.next());
}
System.out.println("--------------------------");
while (listIterator.hasPrevious()){
// ç§»å°listçé¦ç«¯
System.out.println(listIterator.previous());
}
}
}
```
Console:
```java
-------1------- [top, 111, 123, 222, 333, bottom]
-------2-------[top, 111, 123, 222, 333, bottom]
bottom 333 222 123 111 top
list.contains('111') ? false
[123, 213, 321]
list.element = 123
list.get(2) = 321
list.getFirst() = 123
list.getLast() = 321
list.indexOf(213) = 1
list.lastIndexOf(123) = 3
-------4------- [first, 123, 213, 321, 123, 999]
list.peek() = first
list.peekFirst() = first
list.peekLast() = last
list.poll() = first
list.pollFirst() = 123
list.pollLast() = last
-------5------- [213, 321, 123, 999]
list.size() = 4
-------6------- [123, 321, 123, 999]
123
123
true
321
-------7------- []
-------8------- [123, 123, 213, 321, 123]
list = [123, 213]
-------9------- [top, 123, 321, bottom]
--------------------------
top
123
321
bottom
--------------------------
bottom
321
123
top
```
### äºãLinkedList å
é¨ç»æä»¥ååºæ¬å
ç´ å£°æ
1. **LinkedListå
é¨ç»ææ¯ä¸ä¸ªååé¾è¡¨ï¼**å
·ä½ç¤ºæå¾å¦ä¸

æ¯ä¸ä¸ªé¾è¡¨é½æ¯ä¸ä¸ªNodeèç¹ï¼ç±ä¸ä¸ªå
ç´ ç»æ
```java
private static class Node {
// Nodeèç¹çå
ç´
E item;
// æåä¸ä¸ä¸ªå
ç´
Node next;
// æåä¸ä¸ä¸ªå
ç´
Node prev;
// èç¹æé 彿°
Node(Node prev, E element, Node next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
```
**first èç¹ä¹æ¯å¤´èç¹ï¼ lastèç¹ä¹æ¯å°¾èç¹**
2. LinkedList 䏿ä¸ä¸ªå
ç´ ï¼å嫿¯
```java
transient int size = 0; // é¾è¡¨ç容é
transient Node first; // æå第ä¸ä¸ªèç¹
transient Node last; // æåæåä¸ä¸ªèç¹
```
3. LinkedList æä¸¤ä¸ªæé 彿°ï¼ä¸ä¸ªæ¯ç©ºæé 彿°ï¼ä¸æ·»å ä»»ä½å
ç´ ï¼ä¸ç§æ¯åå»ºçæ¶åå°±æ¥æ¶ä¸ä¸ªCollectionéåã
```java
/**
* 空æé 彿°
*/
public LinkedList() {}
/**
* å建ä¸ä¸ªå
嫿å®å
ç´ çæé 彿°
*/
public LinkedList(Collection extends E> c) {
this();
addAll(c);
}
```
### å
ãLinkedList å
·ä½æºç åæ
**åè¨: æ¤æºç æ¯ä½è
æ ¹æ®ä¸é¢ç代ç 示ä¾ä¸æ¥ä¸æ¥è·è¿å»çï¼å¦ææåªäºç鮿è
讲ç䏿£ç¡®çå°æ¹ï¼è¯·ä¸ä½è
èç³»ã**
**æ·»å **
æ·»å çå
·ä½æµç¨ç¤ºæå¾ï¼

å
æ¬æ¹æ³æï¼
- **add**([E](../../java/util/LinkedList.html) e)
- **add**(int index, [E](../../java/util/LinkedList.html) element)
- **addAll**([Collection](../../java/util/Collection.html) extends [E](../../java/util/LinkedList.html)> c)
- **addAll**(int index, [Collection](../../java/util/Collection.html) extends [E](../../java/util/LinkedList.html)> c)
- **addFirst**([E](../../java/util/LinkedList.html) e)
- **addLast**([E](../../java/util/LinkedList.html) e)
- **offer**([E](../../java/util/LinkedList.html) e)
- **offerFirst**([E](../../java/util/LinkedList.html) e)
- **offerLast**([E](../../java/util/LinkedList.html) e)
ä¸é¢å¯¹è¿äºæ¹æ³é个åæå
¶æºç ï¼
**add(E e) ï¼ **
```java
// æ·»å æå®å
ç´ è³listæ«å°¾
public boolean add(E e) {
linkLast(e);
return true;
}
// çæ£æ·»å èç¹çæä½
void linkLast(E e) {
final Node l = last;
// çæä¸ä¸ªNodeèç¹
final Node newNode = new Node<>(l, e, null);
last = newNode;
// 妿l = nullï¼ä»£è¡¨çæ¯ç¬¬ä¸ä¸ªèç¹ï¼æä»¥è¿ä¸ªèç¹å³æ¯å¤´èç¹
// 忝尾èç¹
if (l == null)
first = newNode;
else
// 妿䏿¯çè¯ï¼é£ä¹å°±è®©è¯¥èç¹çnext æåæ°çèç¹
l.next = newNode;
size++;
modCount++;
}
```
> 1. **æ¯å¦ç¬¬ä¸æ¬¡æ·»å çæ¯111ï¼æ¤æ¶é¾è¡¨ä¸è¿æ²¡æèç¹ï¼æä»¥æ¤æ¶çå°¾èç¹last 为null, çææ°çèç¹ï¼æä»¥ æ¤æ¶çå°¾èç¹ä¹å°±æ¯111ï¼æä»¥è¿ä¸ª 111 乿¯å¤´èç¹ï¼åè¿è¡æ©å®¹ï¼ä¿®æ¹æ¬¡æ°å¯¹åºå¢å **
> 2. **ç¬¬äºæ¬¡æ·»å çæ¯ 222ï¼ æ¤æ¶é¾è¡¨ä¸å·²ç»æäºä¸ä¸ªèç¹ï¼æ°æ·»å çèç¹ä¼æ·»å å°å°¾é¨ï¼ååæ·»å ç111 å°±å½ä½å¤´èç¹æ¥ä½¿ç¨ï¼222被添å å°111çèç¹åé¢ã **
**add(int index,E e) : **
```java
/**
*卿å®ä½ç½®æå
¥æå®çå
ç´
*/
public void add(int index, E element) {
// 䏿 æ£æ¥
checkPositionIndex(index);
if (index == size)
// 妿éè¦æå
¥çä½ç½®åé¾è¡¨çé¿åº¦ç¸åï¼å°±å¨é¾è¡¨çæåæ·»å
linkLast(element);
else
// å¦å就龿¥å¨æ¤ä½ç½®çåé¢
linkBefore(element, node(index));
}
// è¶çæ£æ¥
private void checkPositionIndex(int index) {
if (!isPositionIndex(index))
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
// 夿忰æ¯å¦æ¯ææä½ç½®(对äºè¿ä»£æè
æ·»å æä½æ¥è¯´)
private boolean isPositionIndex(int index) {
return index >= 0 && index <= size;
}
// linkLast ä¸é¢å·²ç»ä»ç»è¿
// æ¥æ¾ç´¢å¼æå¨çèç¹
Node node(int index) {
// assert isElementIndex(index);
if (index < (size >> 1)) {
Node x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
// å¨é空èç¹æå
¥å
ç´
void linkBefore(E e, Node succ) {
// assert succ != null;
// succ 峿¯æå
¥ä½ç½®çèç¹
// æ¥æ¾è¯¥ä½ç½®å¤çåé¢ä¸ä¸ªèç¹
final Node pred = succ.prev;
final Node newNode = new Node<>(pred, e, succ);
succ.prev = newNode;
if (pred == null)
first = newNode;
else
pred.next = newNode;
size++;
modCount++;
}
```
> 1. **ä¾å¦å¨ä½ç½®ä¸º1夿·»å å¼ä¸º123 çå
ç´ ï¼é¦å
坹䏿 è¿è¡è¶çæ£æ¥ï¼å¤æè¿ä¸ªä½ç½®æ¯å¦çäºé¾è¡¨çé¿åº¦ï¼å¦æä¸é¾è¡¨é¿åº¦ç¸åï¼å°±å¾æåæå
¥ï¼å¦æä¸åçè¯ï¼å°±å¨ç´¢å¼çå颿å
¥ã**
> 2. **䏿 为1 å¤å¹¶ä¸çäºç´¢å¼çé¿åº¦ï¼æä»¥å¨ç´¢å¼å颿å
¥ï¼é¦å
å¯¹æ¥æ¾ 1 è¿ä¸ªä½ç½®çèç¹æ¯åªä¸ªï¼å¹¶è·åè¿ä¸ªèç¹çåé¢ä¸ä¸ªèç¹ï¼å¨å¤æè¿ä¸ªä½ç½®çåä¸ä¸ªèç¹æ¯å¦ä¸ºnullï¼å¦ææ¯nullï¼é£ä¹è¿ä¸ªæ¤å¤ä½ç½®çå
ç´ å°±è¢«å½ä½å¤´èç¹ï¼å¦æä¸æ¯çè¯ï¼å¤´èç¹çnext èç¹å°±æå123**
**addFirst(E e) :**
```java
// å¨å¤´èç¹æå
¥å
ç´
public void addFirst(E e) {
linkFirst(e);
}
private void linkFirst(E e) {
// å
æ¾å°first èç¹
final Node f = first;
final Node newNode = new Node<>(null, e, f);
first = newNode;
if (f == null)
// f 为nullï¼ä¹å°±ä»£è¡¨ç没æå¤´èç¹
last = newNode;
else
f.prev = newNode;
size++;
modCount++;
}
```
> **ä¾å¦è¦æ·»å top å
ç´ è³é¾è¡¨çé¦é¨ï¼éè¦å
æ¾å°firstèç¹ï¼å¦æfirstèç¹ä¸ºnullï¼ä¹å°±è¯´ææ²¡æå¤´èç¹ï¼å¦æä¸ä¸ºnullï¼å头èç¹çprevèç¹æ¯æ°æå
¥çèç¹ã**
**addLast(E e) : **
```java
public void addLast(E e) {
linkLast(e);
}
// 龿¥æ«å°¾å¤çèç¹
void linkLast(E e) {
final Node l = last;
final Node newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
```
> **æ¹æ³é»è¾ä¸å¨å¤´èç¹æå
¥åºæ¬ç¸å**
**addAll(Collections extends E> c) : **
```java
/**
* å¨é¾è¡¨ä¸æ¹éæ·»å æ°æ®
*/
public boolean addAll(Collection extends E> c) {
return addAll(size, c);
}
public boolean addAll(int index, Collection extends E> c) {
// è¶çæ£æ¥
checkPositionIndex(index);
// æéå转æ¢ä¸ºæ°ç»
Object[] a = c.toArray();
int numNew = a.length;
if (numNew == 0)
return false;
Node pred, succ;
// ç´æ¥å¨æ«å°¾æ·»å ï¼æä»¥index = size
if (index == size) {
succ = null;
pred = last;
} else {
succ = node(index);
pred = succ.prev;
}
// éåæ¯ä¸ªæ°ç»
for (Object o : a) {
@SuppressWarnings("unchecked") E e = (E) o;
// å
对åºçæèç¹ï¼åè¿è¡èç¹ç龿¥
Node newNode = new Node<>(pred, e, null);
if (pred == null)
first = newNode;
else
pred.next = newNode;
pred = newNode;
}
if (succ == null) {
last = pred;
} else {
pred.next = succ;
succ.prev = pred;
}
size += numNew;
modCount++;
return true;
}
```
> ```java
> Collection collec = Arrays.asList("123","213","321");
> list.addAll(collec);
> ```
>
> 1. **ä¾å¦è¦æå
¥ä¸ä¸ªCollection为123,213,321 çéåï¼æ²¡ææå®æå
¥å
ç´ çä½ç½®ï¼é»è®¤æ¯åé¾è¡¨çå°¾é¨è¿è¡é¾æ¥ï¼é¦å
ä¼è¿è¡æ°ç»è¶çæ£æ¥ï¼ç¶å伿éå转æ¢ä¸ºæ°ç»ï¼å¨å¤ææ°ç»ç大尿¯å¦ä¸º0ï¼ä¸º0è¿åï¼ä¸ä¸º0ï¼ç»§ç»ä¸é¢æä½**
> 2. **å 为æ¯ç´æ¥åé¾å°¾æå
¥ï¼æä»¥index = sizeï¼ç¶åéåæ¯ä¸ªæ°ç»ï¼é¦å
çæå¯¹åºçèç¹ï¼å¨å¯¹èç¹è¿è¡é¾æ¥ï¼å 为succ æ¯nullï¼æ¤æ¶last èç¹ = predï¼è¿ä¸ªæ¶åçpredèç¹å°±æ¯éåæ°ç»å®æåçæåä¸ä¸ªèç¹**
> 3. **ç¶å忩容æ°ç»ï¼å¢å ä¿®æ¹æ¬¡æ°**
**addAll(Collections extends E> c) : ** è¿ä¸ªæ¹æ³çæºç åä¸
**offer乿¯å¯¹å
ç´ è¿è¡æ·»å æä½ï¼æºç åaddæ¹æ³ç¸å**
**offerFirst(E e)åaddFirst(E e) æºç ç¸å**
**offerLast(E e)åaddLast(E e) æºç ç¸å)**
**push(E e) åaddFirst(E e) æºç ç¸å**
**ååºå
ç´ **
å
æ¬æ¹æ³æï¼
- **peek**()
- **peekFirst**()
- **peekLast**()
- **element**()
- **get**(int index)
- **getFirst**()
- **getLast**()
- **indexOf**([Object](../../java/lang/Object.html) o)
- **lastIndexOf**([Object](../../java/lang/Object.html) o)
**peek()**
```java
/**
* åªæ¯è®¿é®ï¼ä½æ¯ä¸ç§»é¤é¾è¡¨ç头å
ç´
*/
public E peek() {
final Node f = first;
return (f == null) ? null : f.item;
}
```
> **peek() æºç æ¯è¾ç®åï¼ç´æ¥æ¾å°é¾è¡¨ç第ä¸ä¸ªèç¹ï¼å¤ææ¯å¦ä¸ºnullï¼å¦æä¸ºnullï¼è¿ånullï¼å¦åè¿åé¾é¦çå
ç´ **
**peekFirst() ï¼ æºç åpeek() ç¸å**
**peekLast():**
```java
/**
* 访é®ï¼ä½æ¯ä¸ç§»é¤é¾è¡¨ä¸çæåä¸ä¸ªå
ç´
* æè
è¿ånull妿é¾è¡¨æ¯ç©ºé¾è¡¨
*/
public E peekLast() {
final Node l = last;
return (l == null) ? null : l.item;
}
```
> **æºç 乿¯è¾å¥½çè§£**
**element() :**
```java
/**
* åªæ¯è®¿é®ï¼ä½æ¯ä¸ç§»é¤é¾è¡¨ç第ä¸ä¸ªå
ç´
*/
public E element() {
return getFirst();
}
public E getFirst() {
final Node f = first;
if (f == null)
throw new NoSuchElementException();
return f.item;
}
```
> **ä¸peek()ç¸åçå°æ¹é½æ¯è®¿é®é¾è¡¨ç第ä¸ä¸ªå
ç´ ï¼ä¸åæ¯elementå
ç´ å¨é¾è¡¨ä¸ºnullçæ¶å伿¥ç©ºæéå¼å¸¸**
****get**(int index) : **
```java
/*
* è¿åé¾è¡¨ä¸æå®ä½ç½®çå
ç´
*/
public E get(int index) {
checkElementIndex(index);
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++)
x = x.next;
return x;
} else {
Node x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
```
> **get(int index)æºç 乿¯æ¯è¾å¥½çè§£ï¼é¦å
坹䏿 è¿è¡è¶çæ£æ¥ï¼æ²¡æè¶ççè¯ç´æ¥æ¾å°ç´¢å¼ä½ç½®å¯¹åºçnodeèç¹ï¼è¿è¡è¿å**
**getFirst() ï¼æºç åelement()ç¸å**
**getLast(): ç´æ¥æ¾å°æåä¸ä¸ªå
ç´ è¿è¡è¿åï¼ågetFistå ä¹ç¸å**
**indexOf(Object o) :**
```java
/*
* è¿åç¬¬ä¸æ¬¡åºç°æå®å
ç´ çä½ç½®ï¼æè
-1妿ä¸å
嫿å®å
ç´ ã
*/
public int indexOf(Object o) {
int index = 0;
if (o == null) {
for (Node x = first; x != null; x = x.next) {
if (x.item == null)
return index;
index++;
}
} else {
for (Node x = first; x != null; x = x.next) {
if (o.equals(x.item))
return index;
index++;
}
}
return -1;
}
```
> **ä¸¤ç§æ
åµï¼**
>
> 1. **妿éè¦æ£ç´¢çå
ç´ æ¯nullï¼å¯¹å
ç´ é¾è¡¨è¿è¡éåï¼è¿åxçå
ç´ ä¸ºç©ºçä½ç½®**
> 2. **妿éè¦æ£ç´¢çå
ç´ ä¸æ¯nullï¼å¯¹å
ç´ çé¾è¡¨éåï¼ç´å°æ¾å°ç¸åçå
ç´ ï¼è¿åå
ç´ ä¸æ **
**lastIndexOf(Object o) : **
```java
/*
* è¿åæå䏿¬¡åºç°æå®å
ç´ çä½ç½®ï¼æè
-1妿ä¸å
嫿å®å
ç´ ã
*/
public int lastIndexOf(Object o) {
int index = size;
if (o == null) {
for (Node x = last; x != null; x = x.prev) {
index--;
if (x.item == null)
return index;
}
} else {
for (Node x = last; x != null; x = x.prev) {
index--;
if (o.equals(x.item))
return index;
}
}
return -1;
}
```
> **ä»IndexOf(Object o)æºç ååçè§£**
**å é¤**
å é¤èç¹ç示æå¾å¦ä¸ï¼

å
æ¬çæ¹æ³æï¼
- **poll**()
- **pollFirst**()
- **pollLast**()
- **pop**()
- **remove**()
- **remove**(int index)
- **remove**([Object](../../java/lang/Object.html) o)
- **removeFirst**()
- **removeFirstOccurrence**([Object](../../java/lang/Object.html) o)
- **removeLast**()
- **removeLastOccurrence**([Object](../../java/lang/Object.html) o)
- **clear**()
**poll() : **
```java
/*
* 访é®å¹¶ç§»é¤é¾è¡¨ä¸æå®å
ç´
*/
public E poll() {
final Node f = first;
return (f == null) ? null : unlinkFirst(f);
}
// æå¼ç¬¬ä¸ä¸ªé空èç¹
private E unlinkFirst(Node f) {
// assert f == first && f != null;
final E element = f.item;
final Node next = f.next;
f.item = null;
f.next = null; // help GC
first = next;
if (next == null)
last = null;
else
next.prev = null;
size--;
modCount++;
return element;
}
```
> **poll()æ¹æ³ä¹æ¯è¾ç®åç´æ¥ï¼é¦å
éè¿Nodeæ¹æ³æ¾å°ç¬¬ä¸ä¸ªé¾è¡¨å¤´ï¼ç¶åæé¾è¡¨çå
ç´ åé¾è¡¨å¤´æåçnextå
ç´ ç½®ç©ºï¼åænextèç¹çå
ç´ å为头èç¹çå
ç´ **
**pollFirst() : ä¸poll() æºç ç¸å**
**pollLast(): ä¸poll() æºç å¾ç¸ä¼¼ï¼ä¸åè§£é**
**pop()**
```java
/*
* å¼¹åºé¾è¡¨çæå®å
ç´ ï¼æ¢å¥è¯è¯´ï¼ç§»é¤å¹¶è¿åé¾è¡¨ä¸ç¬¬ä¸ä¸ªå
ç´
*/
public E removeFirst() {
final Node f = first;
if (f == null)
throw new NoSuchElementException();
return unlinkFirst(f);
}
// unlinkFirst æºç ä¸é¢ðæ
```
> **removeFirstæºç å°±å¤äºå¦æé¦é¨å
ç´ ä¸ºnullï¼å°±ç´æ¥æåºå¼å¸¸çæä½**
**remove**(int index):
```java
/*
* ç§»é¤é¾è¡¨æå®ä½ç½®çå
ç´
*/
public E remove(int index) {
checkElementIndex(index);
// æ¾å°index çèç¹ï¼æå¼æå®èç¹
return unlink(node(index));
}
// æå¼æå®èç¹
E unlink(Node x) {
// æ¾å°é¾æ¥èç¹çå
ç´ ï¼nextèç¹åprevèç¹
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;
}
```
**remove**([Object](../../java/lang/Object.html) o)
```java
/*
* ç§»é¤å表ä¸ç¬¬ä¸æ¬¡åºç°çæå®å
ç´ ï¼å¦æåå¨çè¯ã妿å表ä¸å
嫿å®å
ç´ ï¼åä¸ä¼æ¹åï¼
* æ´è¿ä¸æ¥æ¥è¯´ï¼ç§»é¤ç´¢å¼æå°çå
ç´ ï¼åææ¯(o == null ? get(i) == null : o.equals(get(i)))
*/
public boolean remove(Object o) {
// 妿o为null
if (o == null) {
for (Node x = first; x != null; x = x.next) {
// å¹é
null对象ï¼å 餿§å¯¹è±¡ï¼è¿åtrue
if (x.item == null) {
unlink(x);
return true;
}
}
} else {
// 妿ä¸ä¸ºnull
for (Node x = first; x != null; x = x.next) {
// å¹é
对åºèç¹ï¼è¿åtrue
if (o.equals(x.item)) {
unlink(x);
return true;
}
}
}
return false;
}
```
**removeFirst() åremove() æºç ç¸å**
**removeFirstOccurrence**([Object](../../java/lang/Object.html) o)å **remove**([Object](../../java/lang/Object.html) o) æºç ç¸å
**removeLast**() å pollLast() ç¸å
**removeLastOccurrence**([Object](../../java/lang/Object.html) o) å **removeFirstOccurrence**([Object](../../java/lang/Object.html) o) ç¸ä¼¼
**clear()**
```java
/*
* æ¸
空ææå
ç´
*/
public void clear() {
// éåå
ç´ ï¼æå
ç´ çå¼ç½®ä¸ºnull
for (Node x = first; x != null; ) {
Node next = x.next;
x.item = null;
x.next = null;
x.prev = null;
x = next;
}
first = last = null;
size = 0;
modCount++;
}
```
> **clear()æ¹æ³ï¼å
æ¾å°é¾è¡¨å¤´ï¼å¾ªç¯é忝ä¸é¡¹ï¼ææ¯ä¸é¡¹çprevï¼itemï¼next屿§ç½®ç©ºï¼æå忏
é¤firstålastèç¹ï¼æ³¨ææºç æä¸ç¹ï¼x = next ï¼è¿è¡ä»£ç æ¯ååéåçææï¼æ ¹æ®nextçå
ç´ åç»§ç»å忥æ¾**
**å
¶ä»æ¹æ³**
é¾è¡¨æå¸¸ç¨çæ¹æ³å°±æ¯æ·»å ãæ¥æ¾ãå é¤ï¼ä¸é¢æ¥ä»ç»ä¸ä¸å
¶ä»çæ¹æ³
**clone**()
```java
/*
* é¾è¡¨å¤å¶
*/
public Object clone() {
// æ¤å¤çclone
LinkedList clone = superClone();
// Put clone into "virgin" state
clone.first = clone.last = null;
clone.size = 0;
clone.modCount = 0;
// Initialize clone with our elements
for (Node x = first; x != null; x = x.next)
clone.add(x.item);
return clone;
}
private LinkedList superClone() {
try {
return (LinkedList) super.clone();
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
}
// æ¬å°æ¹æ³
protected native Object clone() throws CloneNotSupportedException;
```
> **clone() æ¹æ³è°ç¨superClone()è½å¤è·åæ·è´è¿åçå¼ï¼ä½æ¯ä¸ºä»ä¹è¦æfirstålast置为nullï¼debugçæ¶åå°±åç°clone对象ææçå¼é½ä¸ºnulläºï¼èä¸ä¸ºä»ä¹åè¦å¾ªç¯éåé¾è¡¨åæ·»å ä¸éï¼**
**contains**([Object](../../java/lang/Object.html) o) : åindexæºç å ä¹ç¸å
**set**(int index, [E](../../java/util/LinkedList.html) element)
```java
/*
* 卿å®ä½ç½®æ¿æ¢æå®å
ç´
*/
public E set(int index, E element) {
// è¶çæ£æ¥
checkElementIndex(index);
// æ¾å°ç´¢å¼å
ç´ æå¨çä½ç½®
Node x = node(index);
// å
ç´ æ¿æ¢æä½ï¼è¿åæ¿æ¢ä¹åçå
ç´
E oldVal = x.item;
x.item = element;
return oldVal;
}
```
**descendingIterator**()
```java
public Iterator descendingIterator() {
return new DescendingIterator();
}
private class DescendingIterator implements Iterator {
private final ListItr itr = new ListItr(size());
public boolean hasNext() {
return itr.hasPrevious();
}
public E next() {
return itr.previous();
}
public void remove() {
itr.remove();
}
}
```
> **descendingIterator å°±ç¸å½äºå建äºä¸ä¸ªåç½®çIteratorï¼ååéå**
**listIterator**(int index) :
```java
/*
* 卿å®ä½ç½®ä¸è¿åä¸ä¸ªå表çè¿ä»£å¨ï¼è¿ä¸ªlist-Iteratoræ¯æå¿«é失败æºå¶ç
* å¯ä»¥åè§æçå¦ä¸ç¯æç« ArrayList æºç è§£æ
*/
public ListIterator listIterator(int index) {
checkPositionIndex(index);
return new ListItr(index);
}
// ListItr æ¯LinkedListçä¸ä¸ªå
é¨ç±»
private class ListItr implements ListIterator {
// ä¸ä¸ä¸ªè¢«è¿åçèç¹
private Node lastReturned;
// ä¸ä¸ä¸ªèç¹
private Node next;
// ä¸ä¸ä¸ªä¸æ
private int nextIndex;
// ææçä¿®æ¹æ¬¡æ° = ä¿®æ¹æ¬¡æ°ï¼ç¨äºå¤æå¹¶åæ
åµ
private int expectedModCount = modCount;
// 卿å®ä½ç½®å建ä¸ä¸ªè¿ä»£å¨
ListItr(int index) {
next = (index == size) ? null : node(index);
nextIndex = index;
}
// 夿æ¯å¦æä¸ä¸ä¸ªå
ç´
// å¤æçæ åæ¯ä¸ä¸ä¸ªç´¢å¼çå¼ < size ,说æå½åä½ç½®æå¤§ = é¾è¡¨ç容é
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() {
// éè¿å
ç´ ç´¢å¼æ¯å¦çäº0ï¼æ¥å¤ææ¯å¦è¾¾å°å¼å¤´ã
return nextIndex > 0;
}
// éåä¹åçå
ç´
public E previous() {
checkForComodification();
if (!hasPrevious())
throw new NoSuchElementException();
// nextæåé¾è¡¨çä¸ä¸ä¸ªå
ç´
lastReturned = next = (next == null) ? last : next.prev;
nextIndex--;
return lastReturned.item;
}
// ä¸ä¸ä¸ªç´¢å¼
public int nextIndex() {
return nextIndex;
}
// ä¸ä¸ä¸ªç´¢å¼
public int previousIndex() {
return nextIndex - 1;
}
// ç§»é¤å
ç´ ï¼æfail-fastæºå¶
public void remove() {
checkForComodification();
if (lastReturned == null)
throw new IllegalStateException();
Node lastNext = lastReturned.next;
unlink(lastReturned);
if (next == lastReturned)
next = lastNext;
else
nextIndex--;
lastReturned = null;
expectedModCount++;
}
// 设置å½åèç¹ä¸ºeï¼æfail-fastæºå¶
public void set(E e) {
if (lastReturned == null)
throw new IllegalStateException();
checkForComodification();
lastReturned.item = e;
}
// å°eæ·»å å°å½åèç¹çåé¢ï¼ä¹æfail-fastæºå¶
public void add(E e) {
checkForComodification();
lastReturned = null;
if (next == null)
linkLast(e);
else
linkBefore(e, next);
nextIndex++;
expectedModCount++;
}
// jdk1.8å¼å
¥ï¼ç¨äºå¿«ééåé¾è¡¨å
ç´
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();
}
// 夿 âmodCountåexpectedModCountæ¯å¦ç¸çâï¼ä¾æ¬¡æ¥å®ç°fail-fastæºå¶
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
```
**toArray**()
```java
/*
* è¿åLinkedListçObject[]æ°ç»
*/
public Object[] toArray() {
Object[] result = new Object[size];
int i = 0;
//å°é¾è¡¨ä¸ææèç¹çæ°æ®é½æ·»å å°Object[]æ°ç»ä¸
for (Node x = first; x != null; x = x.next)
result[i++] = x.item;
return result;
}
```
**toArray**(T[] a)
```java
/*
* è¿åLinkedListçæ¨¡æ¿æ°ç»ãæè°æ¨¡æ¿æ°ç»ï¼å³å¯ä»¥å°T设为任æçæ°æ®ç±»å
*/
public T[] toArray(T[] a) {
// è¥æ°ç»açå¤§å° < LinkedListçå
ç´ ä¸ªæ°(æå³çæ°ç»aä¸è½å®¹çº³LinkedListä¸å
¨é¨å
ç´ )
// åæ°å»ºä¸ä¸ªT[]æ°ç»ï¼T[]ç大å°ä¸ºLinkedList大å°ï¼å¹¶å°è¯¥T[]èµå¼ç»aã
if (a.length < size)
a = (T[])java.lang.reflect.Array.newInstance(
a.getClass().getComponentType(), size);
//å°é¾è¡¨ä¸ææèç¹çæ°æ®é½æ·»å å°æ°ç»aä¸
int i = 0;
Object[] result = a;
for (Node x = first; x != null; x = x.next)
result[i++] = x.item;
if (a.length > size)
a[size] = null;
return a;
}
```
> **åè®° : ç¬è
æç妿µ
ï¼å¦ææåªå¤é误产ç误导ï¼è¯·åæ¶ä¸ç¬è
èç³»æ´æ£ï¼ä¸èµ·å
±å»ºç§¯æåä¸çitæ°å´**
**æç« åèï¼ **
[Java éåç³»å05ä¹ LinkedList详ç»ä»ç»(æºç è§£æ)å使ç¨ç¤ºä¾](https://www.cnblogs.com/skywang12345/p/3308807.html)

