链表是在数据结构中经常见到的一种形式,在Java中可以通过引用传递的方式进行实现,代码如下。
链表就好像火车车厢那样,从火车头开始,每一节车厢之后都连着后一节车厢。每一节车厢就相当于一个节点,每一个节点除了要保存自己的内容之外,还要保存下一个节点的引用。如下图所示:
增加节点肯定是在链表的最后进行增加;
查找节点肯定是依次递归的方式进行查找;
删除节点:实际上就是改变引用传递的地址;
在程序开发中必须考虑两种情况:
a,第一次执行的时候根节点不存在,需要将第一个节点设置成为根节点
b,之后执行的效果
public class Link {//链表操作类
private Node root;//根节点
class Node{//内部类(方便访问外部类私有属性)
private String data;
private Node next;
public Node(String data){
this.data = data;
}
public String getData(){
return this.data;
}
public void add(Node newNode){//将节点增加到合适的位置上去
if(this.next==null) //判断下一个节点是否为空
this.next = newNode;//如果为空,则把新节点设置在该位置上
else //如果不为空,则需要向下继续找next
this.next.add(newNode);//在下一个位置处增加
}
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);//继续向下找
}
}
public boolean search(String data){
if(this.data.equals(data))//判断当前节点的名字是否与查找的一致
return true;//如果一致,返回true
else{ //继续判断下一个
if(this.next!=null){//下一个节点存在,则继续查找
return this.next.search(data);//返回下一个节点的查询结果
}else
return false;//节点不存在
}
}
public void showNode(){
System.out.print(this.getData()+"-->");
if(this.next!=null){//节点不为空,则继续打印
this.next.showNode();//让下一个节点输出
}
}
};
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.showNode();
}
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 static void main(String args[]){
Link l = new Link();
l.addNode("A");
l.addNode("B");
l.addNode("C");
l.addNode("D");
l.addNode("E");
l.addNode("F");
l.printNode();
System.out.println();
l.deleteNode("A");
l.printNode();
System.out.println();
System.out.println(l.contains("A"));
}
}