数组和ArryList都具有添加删除慢的缺点,要从数组或ArryList 中间删除或添加一个元素需要进行新的排列,要付出很大的代价,这就是为什么需要LinkedList的原因。在具有大量删除添加操作的集合中数组不再适合作为存储数据的对象,通常我们都会选择链表作为存储对象。在java语言中所有链表实际上都是双向的。
自己动手写LinkedList
先写节点类
public class Node {
private Object previous;
private Object object;
private Object next;
public Node() {
}
public Node(Object previous ,Object obj, Object next) {
super();
this.previous=previous;
this.object=obj;
this.next=next;
}
public Object getPrevious() {
return previous;
}
public void setPrevious(Object previous) {
this.previous = previous;
}
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
public Object getNext() {
return next;
}
public void setNext(Object next) {
this.next = next;
}
}
在写链表类
public class MyDoubleLinkedList {
private Node first;
private Node last;
private int size;
public MyDoubleLinkedList() {
first=last=null;
size =0;
}
public void add(Object obj) {
Node node=new Node();
node.setObject(obj);
if(first==null)
first=last=node;
else {
node.setPrevious(last);
last.setNext(node);
last=node;
}
size++;
}
public boolean add(int indext,Object obj) {
if(indext<1||indext>size)
throw new ArrayIndexOutOfBoundsException("超出界限!!");
Node node =new Node();
node.setObject(obj);
Node zhizhen=new Node();
zhizhen=first;
if(indext==1) {
node.setNext(first);
first.setPrevious(node);
last=first;
first=node;
}
else {
for(int i=1;i<indext;i++) {
zhizhen=(Node) zhizhen.getNext();
}
node.setNext(zhizhen);
node.setPrevious(zhizhen.getPrevious());
((Node)zhizhen.getPrevious()).setNext(node);
zhizhen.setPrevious(node);
}
size++;
return true;
}
public Object getValue(int indext) {
if(indext<1||indext>size)
throw new ArrayIndexOutOfBoundsException("超出界限!!");
Node node=first;
int i=1;
while(node.getNext()!=null&&i!=indext) {
i++;
node=(Node) node.getNext();
}
return node.getObject();
}
public boolean remove(int indext) {
if(indext<1||indext>size)
throw new ArrayIndexOutOfBoundsException("超出界限!!");
Node temp=first;
if(indext==1) {
((Node)temp.getNext()).setPrevious(null);
first=(Node) temp.getNext();
}
else {
for(int i=1;i<indext;i++)
{
temp=(Node) temp.getNext();
}
((Node)temp.getPrevious()).setNext(temp.getNext());
((Node)temp.getNext()).setPrevious((temp.getPrevious()));
}
size--;
return true;
}
}