范例讲解:单向链表实现(2)
实例讲解:单向链表实现(2)
本章目标
深入链表的操作
深入理解内部类的应用
链表的改进
之前实现了一个简单单向链表,可是如果程序要按照以上的方式操作则肯定会很麻烦,因为要由用户手工去处理各个节点的关系,这样肯定是不行的,所以此处最好将节点的操作进行封装,这样用户使用起来就会比较方便了。假设现在的节点操作有以下几种:增加数据、查找数据、删除数据。特别强调的是,如果要删除节点的话,则直接修改上一个节点的引用即可
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){//判断下一个节点是否为空 //如果下一个节点为空,则把新节点设置在 next 位置上 this.next = newNode; }else{//如果不为空,则表示还有下一个节点 this.next.add(newNode);//在下一个位置处增加 } } public void print(){ System.out.print(this.data + "、"); 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 LinkDemo02 { public static void main(String[] args){ Link l = new Link(); 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(""); System.out.println("查询节点:"+l.contains("A")); } /*结果: * ======== 删除之前 ======== * A、B、C、D、E、 * ======== 删除之后 ======== * A、B、E、 * 查询节点:true * */ }