数据结构——链表(单向链表)
前面的博客我们提到了数据结构中的数组和数组队列,数组访问速度快但是有存储类型和存储个数的限制
数组队列虽然解决了上面两个问题,但是在指定位置增删元素不方便,需要移动大部分元素
为了适应某些特定场景的需求,我们可以使用链表这一在内存中非线性存储的数据结构
链表的实现其实并没有想象的复杂,具体关系如上图
单向链表的实现
首先我们需要定义一个节点类,需要有数据域和指针域构成,定义一个带Object参数的构造方法和无参的构造方法,分别用来创建存储数据的节点和空节点。
public class Node {
private Object data;//节点的数据域
private Node next;//节点的指针域
public Node(){
this.data=null;
}
public Node(Object data){
this.data=data;//根据数据来创建节点
}
}
然后只需要在节点类中设置两个属性的set和get方法即可。
属性:
然后我们新建我们需要的链表类,为了方便我们实现链表需要的各种方法,我们在链表中定义初始节点,尾节点和size属性
public class Linked {
private Node root;// 声明链表中的初始空节点
private Node last;// 声明链表中的尾节点
private int size;// 存储链表中数据的个数
}
构造方法:
实现链表有两种方法,一种是直接将第一个节点作为头节点,一种是将第一个节点作为空节点指向头节点
这里我使用的是后者,两者在实现其他方法时会有细微的差别注意一下即可
public Linked() {
root = new Node();
}
访问链表的方法(以add方法举例):
add方法有两种实现的方法,一种是头插法,一种是尾插法。就是在添加数据时将新的数据放在链表的开始还是结束的位置
我在这里使用的是尾插法:
public void add(Object data) {
Node node = new Node(data);// 根据数据创建节点
// 添加到最后
if (size == 0) {
root.setNext(node);
last = node;
size++;
} else {
last.setNext(node);
last = node;
size++;
}
// //添加到第一个节点
// node.setNext(root.getNext());
// root.setNext(node);
// size++;
}
这样我们一个简单的单向链表就实现了,虽然还只能添加数据,不过最好自己尝试写一个get(int index)方法去测试一下