/*对节点的操作进行封装,这样使用户使用起来比较方便
假设现在操作有一下几种:
增加节点:在链表的最后进行增加
查找节点:依次递归的方式进行查找
删除节点:实际上是改变引用的传递地址,直接修改上一个节点的引用地址即可
*/
class Link{ //链表的完成类
class Node{ //保存每一个节点,此处为了方便直接定义内部类
private String data; //保存节点的内容
private Node next; //保存下一个节点
public Node(String data){ //通过构造方法设置节点的内容
this.data=data;
}
public void Add(Node newNode){ //将节点增加到合适的位置
if(this.next==null){ //如果下一个节点为空,则把节点设置在next的位置上
this.next=newNode;
}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;
}else{ //向下判断
if(this.next!=null){ //判断下一个节点是否非空
return this.next.search(data); //返回下一个查询结果
}else{ //如果所有节点查询完之后,没有内容相等,返回false
return 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); //通过Node自动安排此节点放的位置
}
}
public void printNode(){ //输出节点的全部内容
if(this.root!=null){ //如果根元素不为空
this.root.print(); //掉用Node类中的输出操作
}
}
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 LinkDemo{
public static void main(String args[]){
Link node=new Link();
node.AddNode("A"); //增加节点A
node.AddNode("B"); //增加节点B
node.AddNode("C"); //增加节点C
node.AddNode("D"); //增加节点D
node.AddNode("E"); //增加节点E
node.printNode();
//System.out.println(node.contains("A"));
node.deleteNode("B");
node.printNode();
}
};
假设现在操作有一下几种:
增加节点:在链表的最后进行增加
查找节点:依次递归的方式进行查找
删除节点:实际上是改变引用的传递地址,直接修改上一个节点的引用地址即可
*/
class Link{ //链表的完成类
class Node{ //保存每一个节点,此处为了方便直接定义内部类
private String data; //保存节点的内容
private Node next; //保存下一个节点
public Node(String data){ //通过构造方法设置节点的内容
this.data=data;
}
public void Add(Node newNode){ //将节点增加到合适的位置
if(this.next==null){ //如果下一个节点为空,则把节点设置在next的位置上
this.next=newNode;
}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;
}else{ //向下判断
if(this.next!=null){ //判断下一个节点是否非空
return this.next.search(data); //返回下一个查询结果
}else{ //如果所有节点查询完之后,没有内容相等,返回false
return 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); //通过Node自动安排此节点放的位置
}
}
public void printNode(){ //输出节点的全部内容
if(this.root!=null){ //如果根元素不为空
this.root.print(); //掉用Node类中的输出操作
}
}
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 LinkDemo{
public static void main(String args[]){
Link node=new Link();
node.AddNode("A"); //增加节点A
node.AddNode("B"); //增加节点B
node.AddNode("C"); //增加节点C
node.AddNode("D"); //增加节点D
node.AddNode("E"); //增加节点E
node.printNode();
//System.out.println(node.contains("A"));
node.deleteNode("B");
node.printNode();
}
};