概述
LinkedList实质上就是双向链表的拓展的实现,我们将关注一下问题。LinkedList
1、双向链表怎么来实现插入、删除、查询?
2、利用二分法提高查询效率。
3、不同步,线程不安全,需要使用Collections.synchronizedList()达到线程安全。
4、简单说,LinkedList就是数据结构中关于数据操作吗?
模拟实现
1、实现总体图(初始状态)
2、论述双链表的实现思想
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。查询即从第一个节点,不断指向下一节点以便获得自己目标节点。删除、插入同理,最后修改目标节点的前后关系即可,就不多论述了。
3、采用二分法,向下遍历节点
1 public Node node(intindex){2 Node temp=first;3 //采用二分法遍历节点
4 if(indexindex;i--){10 temp=temp.getPrevious();11 }12 }13 returntemp;14 }
4、查询
1 public Object get(intindex){2 checkRange(index);3 Node temp=null;4 if(null!=first){5 temp=node(index);6 }7 returntemp.getObj();8 }
5、插入一个元素(头部插入、尾部插入、中间插入)
public void add(intindex,Object obj){
checkRange(index);//移动指针,指向索引位置的节点
Node temp=node(index);//从中间任任意一个位置插入
if(first!=null){//创建一个新节点
Node n=newNode();//修改当前节点的前后节点
Node before=temp.getPrevious();
n.setPrevious(before);
n.setNext(temp);
n.setObj(obj);
before.setNext(n);
temp.setPrevious(n);
}
}
public void add(Object obj){
Node n=new Node();
//如果队头为空从队头插入
if(first==null){
//初始状态:头尾指针指向第一个节点
n.setObj(obj);
n.setPrevious(null);
n.setNext(null);
first=n;
last=n;
}else{//从队尾部插入
n.setObj(obj);
n.setPrevious(last);
n.setNext(null);//上一个实现的next指向下一个节点
last.setNext(n);
last=n;
}
size++;
}
6、删除
1 public void remove(intindex){2 checkRange(index);3 if (null!=first){4 //遍历直到目标节点
5 Node temp=node(index);6 Node befor=temp.getPrevious();7 Node after=temp.getNext();8 after.setPrevious(befor);9 befor.setNext(after);10 size--;11 }12 }
7、源于揭秘LinkedList的核心部分,就没有赘述所有实现的方法。