关于链表数据结构
Java 中有个 LinkedList 集合,底层的数据结构就是双向链表数据结构,这个集合 Sun 已经帮我们写好了,这里以单向链表为例,写一个简单的集合方法,好帮助自己理解链表这种数据结构。
-
单向链表的基本单元是节点(Node)
-
节点包含两种属性:当前节点存储的数据 + 下一节点的内存地址
以下代码包含两个类:链表类(代表的含义其实就是 Sun 写的集合接口)、节点类
链表类:
链表有 增、删、改、查、查询元素个数 等等方法,这里只实现往列表尾部添加元素的
add
方法和查询元素个数size
方法,这里的代码其实需要很好地理解链表这种数据结构。往链表的尾部添加元素前,需要先找到头节点header
和尾节点currentLastNode
,找尾节点还需要单独写一个findLast
方法来寻找如下所示:
public class Link {
Node header; // 声明一个头结点,并没有创建出来,默认是 null
int size = 0;
// 链表中元素的个数
public int size(){
return size;
}
// 往链表末尾增加元素
public void add(Object data){
if (header == null){ // 还没有节点,创建头结点
header = new Node(data, null); // 这个时候的头结点也是尾节点
}else { // 头结点不是空,头结点已经有了。此时应该找到末尾节点,让末尾节点的 next 属性存入新节点的地址
Node currentLastNode = findLast(header); // 当前的尾节点
currentLastNode.next = new Node(data,null);
}
size++;
}
// 删除链表中某个元素
public void remove(Object data){
}
// 修改链表中某个数据
public void modify(Object newData, int index){
}
// 查询链表中某个数据
public int find(Object data){
return 0;
}
// 专门查找末尾节点的方法
private Node findLast(Node node){
if (node.next == null){ // node 本身就是尾结点,直接返回 node
return node;
}else { // node 本身不是尾节点
return findLast(node.next); // 递归
}
}
}
节点类:
public class Node {
Object data; // 当前节点存储的数据
Node next; // 下一个节点的内存地址
// 无参数的构造方法
public Node(){
}
// 有参数的构造方法
public Node(Object data, Node next){
this.data = data;
this.next = next;
}
}
测试类:
public class Test {
public static void main(String[] args) {
// 创建一个链表对象
Link link1 = new Link();
/*
// 创建多个节点对象
Node n1 = new Node(new Object(),new Node());
Node n2 = new Node(new Object(),new Node());
Node n3 = new Node(new Object(),new Node());
Node n4 = new Node(new Object(),new Node());
*/
link1.add(100);
link1.add("abc");
link1.add(new Object());
System.out.println(link1.size()); // 3
}
}
运行结果:
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
3
Process finished with exit code 0