建立
①定义节点
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("未查询到相关信息");
}
}