LinkedList底层用双向链表实现的存储。特点:查询效率低,增删效率高,线程不安全。
双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向前一个节点和后一个节点。 所以,从双向链表中的任意一个节点开始,都可以很方便地找到所有节点。
关于双向链表,可以参考我之前的一篇文章《数据结构--链表》
![](https://i-blog.csdnimg.cn/blog_migrate/df0391b039209abe617d5e4b18cbe8c5.png)
自定义一个链表:
package cn.sxt.collection;
public class Node {
Node previous; //上一个结点
Node next; //下一个结点
Object element; //元素数据
public Node(Node previous, Node next, Object element) {
super();
this.previous = previous;
this.next = next;
this.element = element;
}
public Node(Object element) {
super();
this.element = element;
}
}
SxtLinkedList04
public class SxtLinkedList04 {
private Node first; //第一个结点
private Node last; //最后一个结点
private int size; //链表长度
//在第index结点前面插入一个结点obj
public void add(int index,Object obj) {
Node newNode = new Node(obj);
Node temp = getNode(index);
if(temp!=null) {
Node up = temp.previous;
up.next=newNode;
newNode.previous=up;
newNode.next = temp;
temp.previous = newNode;
}
}
public void remove(int index) {
Node temp = getNode(index);
if(temp!=null) {
Node up = temp.previous;
Node down = temp.next;
if(up != null)
{
up.next = down;
}
if(down != null)
{
down.previous = up;
}
//被删除的元素是第一个
if(index == 0) {
first = down;
}
//被删除的元素是最后一个
if(index == size) {
last = up;
}
size--;
}
}
//["a","b,"c""d"] 获取
public Object get(int index) {
if(index<0||index>size-1) {
throw new RuntimeException("索引数字不合法"+index);
}
Node temp = getNode(index);
return temp!=null?temp.element:null;
}
public Node getNode(int index) {
Node temp = null;
if(index<=(size>>1)) { //从前向后
temp = first;
for(int i=0; i<index;i++) {
temp=temp.next;
}
}else { //从后向前
temp = last;
for(int i=size-1; i>index;i--) {
temp=temp.previous;
}
}
return temp;
}
//["a","b "]
public void add(Object obj) {
Node node = new Node(obj);
if(first == null) { //第一个结点
first = node; //这个结点即是第一个又是最后一个
last = node;
}else {
node.previous = last; //现在的前一个是之前的最后一个结点
node.next = null; //目前下一个为空
last.next = node;
last = node;
}
size++;
}
public String toString() {
//[a,b,c] first=a; last=c;
StringBuilder sb = new StringBuilder("[");
Node temp = first;
while(temp!=null) {
sb.append(temp.element+",");
temp = temp.next;
}
sb.setCharAt(sb.length()-1,']');
return sb.toString();
}
public static void main(String[] args) {
SxtLinkedList04 list = new SxtLinkedList04();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
System.out.println(list);
list.add(2, "f");
System.out.println(list);
}
}