实例讲解:单向链表实现(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
 * */
}