java学习笔记:内部类实现单链表
?
?
/*第一个节点称为:头节点,或根节点[示例]:内部类实现单链表*/class Link{ private Node head; //定义头节点,是链表的一个成员变量,是Node类的对象 public void add(String name) //添加链表中的元素(节点) { Node newNode= new Node(name); if(this.head==null) //如果没有头节点就把头节点作为头节点 { this.head=newNode; } else { //从根节点开始判断插不插,头节点后面如果没有节点就插在头结点后面, //有的话就再判断下一个节点后面有木有... 目的是插在最后面 this.head.addNode(newNode); //addNode是内部类的方法 } } public boolean search(String name) //查找节点 { if(head!=null) //首先检测头节点 { return this.head.searchNode(name); //searchNode是内部类的方法 } else { return false; } } public void delete(String name) //删除链表中的元素 { if(this.search(name)) //先看看这个链表中有没有这个节点的名字 { //这个this是链表本身,不是指节点,而head只是链表的一个成员变量 //而对于Node类来说,head是它的实例对象 if(this.head.name.equals(name)) //如果发现要删除的是头节点 { if(this.head.nextNode!=null) { this.head=this.head.nextNode; //将头节点的下一个节点变成根节点 } else { this.head=null; //如果只有一个头节点,删除之后就木有节点了 } } else //如果要删除的不是头节点,就看看是不是要删除头节点的下一个节点 { if(this.head.nextNode!=null) { this.head.nextNode.deleteNode(head,name); //deleteNode是内部类的方法 } } } } public void print() //打印 { if(this.head!=null) { this.head.printNode(); } } //----------- 内部类 -----------------// class Node //使用内部类的话,每一个节点就是一个Node对象 { private String name; //保存节点名称 private Node nextNode; //保存下一个节点 public Node(String name) //构造 { this.name=name; } public void setNextNode(Node nextNode) //设置下一个节点 { this.nextNode=nextNode; } public Node getNextNode() //获取下一个节点 { return this.nextNode; } public String getName() //获取节点名称,我们的节点简单,就只有名称 { return this.name; } public void addNode(Node newNode) //添加节点 { if(this.nextNode==null)//如果不存在下一个节点,就将新节点插到它的后面 { this.nextNode=newNode; //加在最后一个位置 } else { this.nextNode.addNode(newNode); //否则就让下一个节点判断插不插,嵌套调用 } } public boolean searchNode(String name) //通过名称查找节点 { if(this.name.equals(name)) //比较当前节点是否符合 { return true; } else { if(nextNode!=null) //下一个节点不为空就继续比较 { return this.nextNode.searchNode(name);//否则就继续查找,递归查找下一个节点 } else { return false; } } } public void deleteNode(Node preNode,String name) //删除节点 { if(this.name.equals(name)) //如果当前节点名称就是所要要删除的 { preNode.nextNode=this.nextNode;//将this的下一个节点引用传给this的上一个节点保存 } else { this.nextNode.deleteNode(this,name);//递归下个节点确认其名称是否就是要删除的 } } public void printNode() //打印节点 { s.tp(this.name+"->"); if(this.nextNode!=null) { this.nextNode.printNode(); } } }}class Demo{ public static void main(String[] args) throws Exception { Link l= new Link(); l.add("火车头"); l.add("1号车厢"); l.add("2号车厢"); l.add("3号车厢"); l.add("4号车厢"); l.add("5号车厢"); l.print(); s.op(); s.op("删除后-----------------------------------------------"); l.delete("5号车厢"); l.print(); }}class s //万能打印{ public static void op(Object obj) { System.out.println(obj); //打印并换行 } public static void op() { System.out.println(); //打印空行 } public static void tp(Object obj) { System.out.print(obj); //打印不换行 }}
?