LinkedList集合内部是链表数据结构存储元素机制,前一个存储节点对象记住下一个存储节点对象的地址这样环环相扣形成一个链条,就像自行车的链条一样.每存储一个元素在链表最后节点处记住新元素对象的地址,当需要删除一个元素只需在被删除元素的前一个元素切断与被删除元素的地址引用替换成指向被删除元素后一个元素的地址,被删除元素因为没有被任何对象地址引用 则会被垃圾回收清理从而达到删除元素的效果.
了解链表结构的原理后我们用代码实现这个案例吧!具体代码要点细节部分已经注释好了 整理好思路仔细阅读即可.
首先我们创建一个节点类 属性value用于存储数据 next表示下一个节点对象
package LinkedList;
public class Node { //定义节点对象 用用于存储 元素value 关联一下一个节点
private Object value;
private Node next;
public Node(Object value) { //构造方法传一个元素对象并存储存储
this.value = value;
}
public Object getValue() { //返回当前节点对象
return value;
}
public void setValue(Object value) { //设置当前节点对象
this.value = value;
}
public Node getNext() { //返回下一个节点对象
return next;
}
public void setNext(Node next) { //设置下一个节点对象
this.next = next;
}
}
有了节点对象作为链表结构的铺垫 我们现在再创建LinkedList的描述类吧
package LinkedList;
public class MyLinkedList {
private Node first; //定义一个头部节点 代表链表集合第一个元素
private int size = 0; //定义链表集合容量大小
public int getSize(){ //返回集合大小方法
return size;
}
public void addValue(Object value){ //添加元素方法
Node newNode = new Node(value); //new一个节点对象存储元素
if(size == 0){ //先判断是否为第一个元素
first= newNode; //将头部节点对象指向刚存下一个元素的新节点
}else{
Node temp = first; //不是第一个节点 则需要一个临时节点充当指针 从头往后遍历
while(temp.getNext()!=null){ //临时节点下一个节点对象不为空时
temp=temp.getNext(); //指针临时节点向后移动一位 指向一下节点对象
} //循环保证指针节点最后指向最后一个元素
temp.setNext(newNode); //临时节点关联的下一个节点对象指向 将新节点
}
size++; //存储成功size+1
}
public Object getValue(int index){ //取出指定索引下的元素
Node temp = first; //指针指向头部元素
for(int i = 0;i<index;i++){
temp =temp.getNext(); //指针指向index元素的前一个元素时循环结束
} //并取出index前一位元素的一下一个元素 也就是当前index下的元素
return temp.getValue(); //直接返回index下的元素
}
public void setValue(int index,Object value){ //设置索引下的元素 原理同getValue方法
Node temp = first;
for(int i = 0;i<index;i++){
temp =temp.getNext();
}
temp.setValue(value);
}
public void clear(){ //清空集合方法
size = 0;
first =null; //链表数据结构最关键的是头部元素 当头部元素为空时后面的元素也无法找到
} //涉及到jvm虚拟机垃圾回收机制 细节请参考深入理解jvm虚拟机一书
public void removeAt(int index){ //删除指定索引下的元素
if(index == 0){ //假如删除头部元素:将头部对象指向原来头部节点对象的下一个节点对象
first = first.getNext(); //原来的头部节点对象因为没有被地址引用会被jvm垃圾回收 达到删除效果
}else{
Node temp = first; //指针从头部往后遍历
for(int i = 0;i<index-1;i++){ //遍历到index元素的前两位元素下
temp = temp.getNext();
} //指针从index的前一个元素关联到index后一位元素 孤立index下元素导致没有被地址指向被垃圾回收
temp.setNext(temp.getNext().getNext());
}
size--; //元素删除成功 size-1
}
}
public class LinkedDemo {
public static void main(String[] args) {
MyLinkedList list = new MyLinkedList();
list.addValue(0);
list.addValue(1);
list.addValue(2);
list.addValue(3);
list.addValue(4);
list.addValue(5);
for(int i = 0;i<list.getSize();i++){
System.out.println(list.getValue(i));
}
}
}
这样节点对象和list对象相辅相成,一个自主封装的链表集合就完成了;其中涉及到数据结构和一点逻辑算法的知识,对于初学java基础和对算法基础比较薄弱的朋友这个案例可能有点不能接受,但是不要怕随着时间推移每天学习的积累 这两段代码花时间多琢磨一下必定能参透其中的真谛! 码字不易代码加注释更不易,觉得有收获就小小点个赞吧! ~~~~~~~~~~~~ :)