1. 倆表的概念
鏈表的概念与帆,鏈表是由一些列的非連續(xù)的節(jié)點組成的存儲結(jié)構(gòu),簡單分下類的話七兜,鏈表又分為單向鏈表和雙向鏈表凤粗,而單向/雙向鏈表又可以分為循環(huán)鏈表和非循環(huán)鏈表,下面簡單就這四種鏈表進行簡單的說明十性。
- 單向鏈表是前面節(jié)點只指向后面節(jié)點,后面節(jié)點不指向前面節(jié)點,節(jié)點中只有一個成員存儲下一個節(jié)點位置季稳。
- 雙向鏈表是每個節(jié)點都有兩個存儲下一個和上一個節(jié)點位置的成員,鏈表可以上下游動澈魄。
- 循環(huán)鏈表是鏈表的最后一個節(jié)點的尾指針指向頭節(jié)點景鼠,頭結(jié)點的上一個節(jié)點指針指向尾節(jié)點,在單向鏈表中就表現(xiàn)在尾節(jié)點的下一個節(jié)點指針指向頭結(jié)點痹扇。
- 非循環(huán)鏈表铛漓,就是尾節(jié)點的下一個節(jié)點指針指向空,雙向鏈表中頭結(jié)點的上一個節(jié)點指針和尾節(jié)點的下一個節(jié)點指針都是指向空的鲫构。
2. 底層存儲結(jié)構(gòu)
鏈表的底層存儲實體結(jié)構(gòu)為
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;
}
}
由源碼可知浓恶,LinkedList采用的雙向鏈表結(jié)構(gòu)。
鏈表的成員為
transient int size = 0;
/**
* Pointer to first node.
* Invariant: (first == null && last == null) ||
* (first.prev == null && first.item != null)
*/
transient Node<E> first;
/**
* Pointer to last node.
* Invariant: (first == null && last == null) ||
* (last.next == null && last.item != null)
*/
transient Node<E> last;
3. 添加元素
添加元素主要有兩個方法结笨,一個默認添加到鏈表末尾處包晰,一個可以指定添加到指定的位置處。分別為:
public boolean add(E e) {
linkLast(e);
return true;
}
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++;
}
public void add(int index, E element) {
checkPositionIndex(index);
if (index == size)
linkLast(element);
else
linkBefore(element, node(index));
}
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;
}
}
void linkBefore(E e, Node<E> succ) {
// assert succ != null;
final Node<E> pred = succ.prev;
final Node<E> newNode = new Node<>(pred, e, succ);
succ.prev = newNode;
if (pred == null)
first = newNode;
else
pred.next = newNode;
size++;
modCount++;
}
2. 刪除元素炕吸,修改元素
剩下的操作比較簡單伐憾,就不在贅述。