/*
第一个节点称为:头节点,或根节点
[示例]:内部类实现单链表
*/
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); //打印不换行
}
}