基本概念:
链表和数组相比的优势是:没有长度限制,也就是一个动态对象数组;
链表是一种基本的数据结构,链表主要目的是依靠引用关系来实现多个数据的保存;
对于所有节点操作,由于不知道要循环多少次,所以只能够使用while循环,但是递归函数比直接使用while函数更好。
链表保存的是当前的内容,以及指向的下一个节点(客户端不关注);
Node实际上是设置数据和取数据(客户端的主要操作)的过程,那为什么需要Node?
- 由于数据本身不具备先后关系,所以要使用Node类来封装数据,同时利用Node类指定下一个节点;
链表的基本实现:
链表的基本操作特点:
- 客户端不关注具体Node以及引用关系的细节,只关注Link类中提供的方法(数据的保存,数据的输出);
- Link类主要功能是控制Node类对象的产生和根节点;
- Node类主要负责数据的保存以及引用关系的分配;
确定程序结构:
class Link{ ///链表类,外部只能看见这个类
// 之所以定义在内部,主要是让其为Link类服务
private class Node{ //定义节点类
private String data; //保存数据
private Node next; //引用关系
public Node(String data){
this.data = data;
}
}
//————————————以上为内部类————————————
private Node root; //需要根节点
}
随后就是对代码的填充以及功能的实现;
数据增加:
- public void add(数据类型 变量):普通方法,向链表增加新的数据;
如果进行新数据的增加,应该由Link类负责节点对象的产生,由Link类维护根节点,所有关系的匹配交给Node类;
class Link{ ///链表类,外部只能看见这个类
// 之所以定义在内部,主要是让其为Link类服务
private class Node{ //定义节点类
private String data; //保存数据
private Node next; //引用关系
public Node(String data){
this.data = data;
}
public void addNode(Node newNode){
if(this.next == null){
this.next = newNode;
}else{
this.next.addNode(newNode);
}
}
}
//————————————以上为内部类————————————
private Node root; //需要根节点
public void add(String data){
Node newNode = new Node(data);
if(this.root == null){ // 当前没有根节点
this.root = newNode; //保存根节点
}else{ //存在根节点,其他节点交给Node处理
this.root.addNode(newNode);
}
}
}
链表中的方法:
- public void add(数据类型 变量):普通方法,向链表增加新的数据;
- public int size():普通方法,取得链表中保存的元素的个数;
- public boolean isEmpty():普通方法,判断是否是空链表;实际上可以判断root是否有对象,或者保存的数据量是不是0来判断是不是空链表;
- public boolean contains(数据类型 变量):普通方法,判断某一个数据是否存在;以String为例,查询所保存的内容,用equals()进行比较,如果是false则是空的,如果是true则不为空;
- public 数据类型 get(int index):普通方法,根据索引取得数据;
- public void set(int index,数据类型 变量):普通方法,使用新的内容替换指定索引的旧内容;
- public void remove(数据类型 变量):普通方法,删除指定数据,如果是对象则要进行对象比较;
- public 数据类型 []toArray():普通方法,将链表以对象数组的方式返回;