LinkedList實(shí)現(xiàn)
Android的LinkedList是通過雙向列表實(shí)現(xiàn)的。鏈表元素除了含有自身的值以為,還含有上一個(gè)元素和下一個(gè)元素的引用。
private static final class Link<ET> {
ET data;//當(dāng)前值
Link<ET> previous, next;//上一個(gè),和下個(gè)鏈表對(duì)象的引用
Link(ET o, Link<ET> p, Link<ET> n) {
data = o;
previous = p;
next = n;
}
}
普通添加方法
真正是由該方法實(shí)現(xiàn),新元素添加在鏈表的最后,addLast同樣是這個(gè)方法實(shí)現(xiàn)
將上一個(gè)元素的head節(jié)點(diǎn)指向新元素
private boolean addLastImpl(E object) {
Link<E> oldLast = voidLink.previous;
//新元素的頭指向上一個(gè)元素,尾指向鏈表的頭部
Link<E> newLink = new Link<E>(object, oldLast, voidLink);
//頭元素的頭指向新元素
voidLink.previous = newLink;
//上一個(gè)結(jié)尾元素的尾 指向新元素
oldLast.next = newLink;
size++;
modCount++;
return true;
}
2.在指定位置插入
1.插入的位置要下于link鏈表的長(zhǎng)度
2.向前后移動(dòng)元數(shù)據(jù),空出當(dāng)前位置給新元素,上一個(gè)元素的next和下一個(gè)元素的head分別指向這個(gè)元素。
public void add(int location, E object) {
if (location >= 0 && location <= size) {
Link<E> link = voidLink;
if (location < (size / 2)) {
for (int i = 0; i <= location; i++) {
link = link.next;
}
} else {
for (int i = size; i > location; i--) {
link = link.previous;
}
}
Link<E> previous = link.previous;
Link<E> newLink = new Link<E>(object, previous, link);
previous.next = newLink;
link.previous = newLink;
size++;
modCount++;
} else {
throw new IndexOutOfBoundsException();
}
}
查詢
從頭開始遍歷鏈表元素的每一個(gè)元素。
public boolean contains(Object object) {
Link<E> link = voidLink.next;
if (object != null) {
while (link != voidLink) {
if (object.equals(link.data)) {
return true;
}
link = link.next;
}
} else {
while (link != voidLink) {
if (link.data == null) {
return true;
}
link = link.next;
}
}
return false;
}
刪除
同樣會(huì)遍歷元素 找到對(duì)應(yīng)位置上前后的元素,將之前該位置前后的連個(gè)元素鏈接首位鏈接起來。
@Override
public E remove(int location) {
if (location >= 0 && location < size) {
Link<E> link = voidLink;
if (location < (size / 2)) {
for (int i = 0; i <= location; i++) {
link = link.next;
}
} else {
for (int i = size; i > location; i--) {
link = link.previous;
}
}
Link<E> previous = link.previous;
Link<E> next = link.next;
previous.next = next;
next.previous = previous;
size--;
modCount++;
return link.data;
}
throw new IndexOutOfBoundsException();
}