LinkeList底层是由链表实现的,查询慢,但增删改比较方便
以下是本人画的链表草图(滑稽脸):
1、加元素
/*
* 测试加元素 重点!!!
*/
public void add(Object obj) {
if(first == null) { //第一个为空
Node n = new Node();
n.previous = null;
n.next = null;
first = n;
last = n;
}else {
//直接往last后面增加新的节点
Node n = new Node(); //new一个新的节点
n.setPrevious(last); //新节点的头连接的是是最后一个
n.setObj(obj); //n 为值
n.setNext(null); //新节点的尾连接的是是空
last.setNext(n); //last的下一个是 n
last = n; //最后一个为 n
}
size++; //每增加一个,size就多加一个
}
public int size() {
return size;
}
分析:①如果链表为空,即第一个链表的内容是空,则说明n.next和n.previous的内容为空,所以第一个和最后一个都是n;
②如果链表里面有内容,则第一个链表的内容不为空,则需要往last后面添加新的节点:新节点的头连接的是最后一个,内容是新家的元素,新节点的尾是空,同时,last的下一个是n。
2、在指定位置加元素
/*
* 在指定位置添加元素 重点!!
*/
public void add(int index,Object obj) {
Node temp = null; //指针,所在的节点
if(first != null) {
temp = first; //temp遍历的对象,从第一个开始遍历。
for(int i = 0;i<index;i++) {
temp = temp.next; //把下一个赋给自己
}
}
Node newNode = new Node();
newNode.obj = obj;
if(temp !=null ) {
Node up = temp.previous; //temp为原节点
up.next = newNode;
newNode.previous = up;
newNode.next = temp;
temp.previous = newNode;
size++;
}
}
分析:遍历,寻找为index的索引;
原节点的上一个节点(up)的下一个是新节点(newNode),新节点的上一个是up;
新节点的下一个节点是原节点,原节点的上一个是新节点。
3、get方法
/*
* 测试get
*/
public Object get(int index) {
rangeCheck1(index);
Node temp = null; //指针,所在的节点
if(first != null) {
temp = first; //temp遍历的对象,从第一个开始遍历。
for(int i = 0;i<index;i++) {
temp = temp.next; //把下一个赋给自己
}
}
return temp.obj;
}
比较简单,在此就不分析了
4、删除指定位置的元素
/*
* 删除指定位置的对象
*/
public void remove(int index) {
Node temp = null; //指针,所在的节点
if(first != null) {
temp = first; //temp遍历的对象,从第一个开始遍历。
for(int i = 0;i<index;i++) {
temp = temp.next; //把下一个赋给自己
}
}
if(temp != null) {
Node up = temp.previous;
Node down = temp.next;
up.next = down;
down.previous = up;
}
size--;
}
分析:遍历找出为index的索引
原节点的上一个(up)的下一个是连接下一个(down);
原节点得下一个节点连接上一个