一.继承体系
二.源码分析
- 添加链表元素
//获取指定索引元素
Node<E> node(int index){
//二分查找
if(index < (size >> 1)){
//如果索引值在链表size/2之内
Node<E> prevNode = first;
for(int i=0;i<index;i++){
prevNode=prevNode.next;
}
return prevNode;
}
//否则从尾开始遍历
else{
Node<E> lastNode = last;
for(int j=size-1;j>index;j--){
lastNode=
lastNode.prev;
}
return lastNode;
}
}
插入元素频繁使用node方法根据索引找到要插入元素的位置,同时get方法获取元素也是用到此方法。
- 从链表头部–size/2采用正向遍历
- 如果没有找到对应元素,再从链表尾部反向遍历
- 这样每次只最多遍历一次链表就可以知道索引对应元素
删除链表元素
private void unlink(Node<E> x) {
// TODO Auto-generated method stub
final E item = x.e;//删除元素
final Node<E> next = x.next;//删除元素后一个节点
final Node<E> prev = x.prev;//删除元素前一个节点
//前驱节点为空,表头指向后继元素
if(prev == null){
first = x.next;
}else{
//前驱元素的后继指向后继元素
prev.next = next;
//要删除元素的后继置为null
x.prev = null;
}
//后继元素为空,表尾指针指向前驱元素
if(next == null){
last = x.prev;
}else{
//后继元素的前驱指向前驱元素
next.prev = prev;
//要删除元素的后继指针置为null
x.next = null;
}
//要删除元素置为null
x.e = null;
//集合大小减一
size --;
//操作计数器加一
modCount++;
}
–三.实现栈操作
class myQue{
LinkedList<E> linkedList = null;
LinkedList myQue(){
linkedList = new LinkedList<>();
return linkedList;
}
//加入元素
void addEle(E o){
linkedList.push(o);
}
//弹出元素
E removeEle(){
return linkedList.poll();
}
//检索栈顶数据,但是不删除
public E peek() {
return linkedList.peek();
}
}
–四arraylist和linkedlist比较
- arraylist底层基于数组实现,linkedlist底层基于链表实现。
- arraylist删除和添加元素都需要将剩下的数组元素重新复制一次,linkedlist只需要移动指定元素前后指针即可实现。
- arraylist支持随机访问,而linkedlist要移动指针指针。