单向链表的建立和简单的增删改查

建立

①定义节点

public class Node{
	private String name;
	private int age;
	private Node nextNode;

 	//相应的get、set方法
}

②初始化(此处使用文件信息进行初始化)
PS:我使用了一个私有属性来存储头节点(private Node headNode;)

/**
  * 使用文件对链表进行初始化
  * @param file  文件名
  */
public void initLink(String file) {
 	 try {
		Node moveNode = null;   //移动游标
		BufferedReader bReader = new BufferedReader(new FileReader(new File(file)));
		String name = null;
		//遍历文件,初始化链表
   		while((name=bReader.readLine())!= null) {
    			Node midNode = new Node();
    			String spiltName[] = name.split("%");
    			midNode.setName(spiltName[0]);
    			midNode.setAge(Integer.parseInt(spiltName[1]));
   			 //判断头节点是否为空
    			if(this.headNode == null) {
     				this.headNode = midNode;
    				moveNode = this.headNode;
    			}else {
    				moveNode.setNextNode(midNode);
   				moveNode = midNode;
   			 }    
		}
  		//结束位置赋空
  		moveNode.setNextNode(null);
  
 		 bReader.close();
  		} catch (Exception e) {
   		e.printStackTrace();
 		 }
 }

输出数据

 /**
  * 遍历链表,显示出所有数据
  */
 public void showLink() {
	Node moveNode = this.headNode;     //使得移动游标指向头节点
  	System.out.println("该表中所有数据为:");
  	while(moveNode != null) {
  		 System.out.println(moveNode.getName()+"\t"+moveNode.getAge());
	   moveNode = moveNode.getNextNode();
	}
 }

添加数据

/**
  * 插入数据,位于local之前
  * @param name   插入数据名
  * @param local  指定位置
  */
 public void insertLink(String name,int age,String local) {		
	Node moveNode = this.headNode;
	//是否插到表首
	 if(local.equals(moveNode.getName())) {
   		Node midNode = new Node();
 		midNode.setName(name);
		midNode.setAge(age);
		midNode.setNextNode(moveNode);
		//使得头指针指向新节点
	        this.headNode = midNode;
	        return;
	  }
  
	  //其它位置(定位到目标位置前一位)
 	 while(moveNode.getNextNode() != null) {
  		 if(!local.equals(moveNode.getNextNode().getName())) {
 		   moveNode = moveNode.getNextNode();
  		 }else {
  			  break;
	  	 } 
 	 }
  
 	 //若定位到位置,直接插入,若定位失败,在末尾插入
  	Node midNode = new Node();
  	midNode.setName(name);
  	midNode.setAge(age);
 	midNode.setNextNode(moveNode);
 	//建立链接关系
	midNode.setNextNode(moveNode.getNextNode());
 	moveNode.setNextNode(midNode);
  }

删除数据

/**
  * 删除指定的数据
  * @param name   定位数据
  * java并不需要显式的释放内存空间,因此对于要删除的数据,不给予引用回自动释放
  */
 public void deleNode(String name) {
  	Node moveNode = this.headNode;
	  //若在首位
  	if(name.equals(moveNode.getName())) {
  		 this.headNode = moveNode.getNextNode();
  		 System.out.println("删除成功");
		 return;
	  }
	  //定位到要删除数据的前一位
	  while(moveNode.getNextNode() != null) {
  		 if(name.equals(moveNode.getNextNode().getName())){
   		        //定位到数据
  		 	moveNode.setNextNode(moveNode.getNextNode().getNextNode()); 
  	 	 	System.out.println("删除成功");
   	 		return;
  	 }
   		moveNode = moveNode.getNextNode();
	 }
  
 	 if(moveNode.getNextNode() == null) {
   		System.out.println("未查找到相关信息");
	  }
}

更新数据

/**
  * 修改指定的数据
  * @param name  定位数据
  * @param newName 修改数据
  * @param age   修改数据
  */
 public void updateLink(String name,String newName,int age){
 	Node moveNode = this.headNode;
  
  	while(moveNode != null) {
   		if(name.equals(moveNode.getName())) {
   			 moveNode.setName(newName);
   			 moveNode.setAge(age);
    			 System.out.println("修改成功");
  			 return;
	        }
   	moveNode = moveNode.getNextNode();
  	}
 	if(moveNode == null) {
 		 System.out.println("未查询到相关信息");
  	}
  
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值