主要是要看懂这张图:
一个链表中有许多类似的节点,所以有必要用一个描述节点的类来表达节点,这个类我们称为Node;
每个Node对象中都包含一个表示该节点内容的数据部分,我们称为数据域 ,和一个对下一个节点引用的字段next,即链域。
头节点的数据域为空,链域next是为了获得到下一个节点的数据域,就这样一直循环获得,就可显示出所有的数据域中保存的信息。
直接上代码举例说明:
共四个类:
/**
*
* 存放节点信息的类
*/
public class Node {
private Stu_info stu;//数据域可以为一个类
private Node next;//链域
public Node(Stu_info stu) {
super();
this.stu = stu;
}
// get和set方法
public Stu_info getStu() {
return stu;
}
public void setStu(Stu_info stu) {
this.stu = stu;
}
public Node getNext() {
return next;
}
public void setNext(Node node) {
this.next = node;
}
}
/**
* 实体类
*/
public class Stu_info {
private String name;
private char sex;
private int age;
//构造方法
public Stu_info(String name, char sex, int age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
//get和set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "name=" + name + ", sex=" + sex + ", age=" + age;
}
}
/**
* 实现方法的类 增加、删除、显示所有、根据条件查询、插入。
*/
public class User {
private Node head;// 定义一个头节点
public User() {
this.head = new Node(null);// 头节点为空
}
// 增加的方法
public void add(Node node) {
Node n = head;// 头节点
// 循环判断下一个节点是否为空
while (n.getNext() != null) {
n = n.getNext();
}
// 如果为空就把设置下一个节点的链域
n.setNext(node);
}
// 显示所有
public void show() {
Node n = head;
// 循环判断下一个节点是否为空,如果不为空就输出信息
while (n.getNext() != null) {
n = n.getNext();// 获得头节点的下一个 节点
// 如果把n.getStu()放在前一个位置会报错,因为n.getStu()第一次会获得头节点,而头节点为空
System.out.println(n.getStu());
}
}
// 根据一个值查询
public Node select(Stu_info si) {
Node node = head;
while (node.getNext() != null) {
node = node.getNext();
// 根据传递的类进行判断
if (node.getStu().equals(si)) {
System.err.println(node.getStu() + "查询成功");
return node;// 返回节点
}
}
return null;
}
// 插入一个节点在指定的位置
// 插入节点就需要获得要插入节点的前一个节点
public void insert(Node node, Stu_info si) {// node 要插入的一个节点 si 为要擦入节点的前一个节点
Node n = select(si);// 调用方法判断是否有这个节点
if (n == null) {
System.err.println("插入失败!");
} else {
// 将知道的si节点的下一个节点赋值给新节点的链域
node.setNext(n.getNext());
// 将新节点的链域赋值给上一个节点
n.setNext(node);
System.err.println("插入成功!");
}
}
// 删除数据
public void delete(Stu_info si) {
Node no = head;// 头节点
Node p = no.getNext();// p为要删除的下一个节点
while (p != null) {// 循环判断
// 通过调用getStu方法判断获得到的类是否相同,也就是比较内存地址
if (p.getStu().equals(si)) {
// 将要删除的前一个节点设置为要被删除的节点的下一个节点
no.setNext(p.getNext());
System.err.println("删除成功!");
break;
}
no = p;//
p = p.getNext();// 获得下一个值
}
}
}
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
Stu_info si = new Stu_info("one", '女', 19);// 调用构造方法赋值
Stu_info si2 = new Stu_info("two", '男', 18);// 调用构造方法赋值
Stu_info si3 = new Stu_info("three", '男', 18);
Node n = new Node(si);// 调用构造方法
Node n2 = new Node(si2);
User user = new User();
// 添加的方法
user.add(n);
user.add(n2);
// 显示所有
user.show();
// 根据一个值来查询
user.select(si2);
// 在指定的位置插入数据
Node node = new Node(si3);
user.insert(node, si2);// node 要插入的一个节点 si2 为要擦入节点的前一个节点
// 删除数据
user.delete(si3);
// 显示所有
user.show();
}
}