由上节可知,如果由用户去处理各个节点的关系,会非常麻烦,所以最好将节点的操作进行封装,这样用户使用起来会比较方便。
例如如果要删除节点,则直接修改上一个节点的引用即可:
class Link{
class Node{ // 将节点类定义成内部类
private String data;
private Node next;
public Node(String data){
this.data = data;
}
public void add(Node newNode){ // 增加一个 add 操作
if(this.next == null){ // 判断下一个节点是否为空
this.next = newNode; // 如果下一个节点为空,则把新节点设置在next位置上
}else { // 如果不为空,表示还有下一个节点
this.next.add(newNode); // 在一个位置增加
}
}
public void print(){
System.out.print(this.data + "\t");
if(this.next !=null){ // 如果下一个节点不为空,则继续打印
this.next.print(); // 让下一个节点输出
}
}
public boolean search(String data){ // 内部定义搜索方法
if(data.equals(this.data)){ // 判断当前节点的名字是否与查找的一致
return true; // 如果一致,则返回 true
}else {
if(this.next != null){ // 下一个节点存在,则继续查找
return this.next.search(data); // 返回下一个查询结果
}else {
return false; // 节点不存在,返回 false
}
}
}
public void delete(Node previous,String data){
// 删除节点
if(data.equals(this.data)){
previous.next = this.next; // 空出当前节点
}else {
if(this.next !=null){
this.next.delete(this,data); // 继续向下找
}
}
}
};
private Node root; // 表示根节点
public void addNode(String data){
// 增加节点的方法
Node newNode = new Node(data); // 建立一个新的节点
if(this.root == null){ // 没有根节点
this.root = newNode; // 将第一个节点设置为根节点
}else{
this.root.add(newNode); // 添加到合适的位置
}
}
public void printNode(){ // 打印全部的节点
if(this.root !=null){ // 判断是否存在根节点
this.root.print();
}
}
public boolean contains(String name){ // 判断元素是否存在
return this.root.search(name); // 调用Node 类中的 search() 方法
}
public void deleteNode(String data){ // 删除节点
if(this.contains(data)){ // 如果节点存在,则执行删除操作
if(this.root.data.equals(data)){ //判断根节点是否满足要求
this.root = this.root.next; // 将根节点之后的内容设置成根节点
}else {
this.root.next.delete(root,data); // 删除节点
}
}
}
};
public class Test{
public static void main(String[] args){
Link l = new Link();
// 增加节点 A,B,C,D,E
l.addNode("A");
l.addNode("B");
l.addNode("C");
l.addNode("D");
l.addNode("E");
System.out.println("=======删除之前=======");
l.printNode(); // 输出节点
l.deleteNode("C"); // 删除节点
l.deleteNode("D"); // 删除节点
System.out.println();
System.out.println("=======删除之后=======");
l.printNode();
System.out.println("查询节点:" + l.contains("A"));
}
}
上面的程序对要操作的节点类进行了包装,用户可以直接调用包装后的类,即可方便执行节点的增加、删除、查找操作。
此处理解其操作原理即可,实际应用中,Java 已经为用户提供了大量的数据结构实现类。