简介
Java内置的LinkedList类底层物理结构是稀疏存储,逻辑结构为链表;
链表中每个元素都包含前缀、元素内容、后缀三个部分,前、后缀分别代表前、后一个元素的地址;
具体步骤:
1、自定义Node类,代表链表中的每一个元素;
Node类中有属性prev存储前一个元素,obj存储本身元素,next存储后一个元素;
public class Node {
private Node prev;//上个元素是Node类
private Object obj;//本身数据用Object类
private Node next;//下个元素是Node类
//这里省略get、set方法以及toString方法,自己记得加
}
2、定义好内部元素的类,我们创建MyLinkedList类;
链表的首个元素非常重要,遍历需要从首元素开始通过next地址往下寻找,所以需要专门用一个属性保存;
末尾元素也很重要,添加时是新增元素的prev,也要修改末尾元素的next,所以需要专门用一个属性保存;
另外还需要一个属性记录链表长度;
public class MyLinkedList {
private Node first;//首元素
private Node last;//尾元素
private int count;//链表长度
//添加元素方法
void add(Object obj) {
Node node = new Node();
if (first == null) {//如果链表目前没数据
node.setPrev(null);//该元素前缀设为空
node.setObj(obj);//元素内容为传入数据
node.setNext(null);//后缀为空
first=node;//链表首元素设为该元素
last=node;//链表尾巴元素设为该元素
} else {//如果链表已经有数据
node.setPrev(last);//前缀为目前的尾元素
node.setObj(obj);//元素内容为传入数据
node.setNext(null);//后缀为空
last.setNext(node);//目前的尾元素成了倒数第二,所以它的后缀改成新增元素
last=node;//尾元素改成新增的这个
}
count++;//链表长度+1
}
//获取链表长度方法
public int getSize(){
return count;//直接返回记录的长度
}
//根据下标获取元素
public Object get(int idx){
Node node = first;//先找到链表首元素
for (int i = 0; i < idx; i++) {//要获取第几个元素,就循环几次
node = node.getNext();//循环了idx次后拿到第idx个元素,保存到node里
}
return node.getObj();//返回这个元素
}
public Node getFirst() {
return first;
}
public void setFirst(Node first) {
this.first = first;
}
public Node getLast() {
return last;
}
public void setLast(Node last) {
this.last = last;
}
}
测试
class Test{
public static void main(String[] args) {
MyLinkedList ml = new MyLinkedList();
ml.add("a");
ml.add("b");
ml.add("c");
System.out.println(ml.getSize());
System.out.println(ml.get(2));
}
}