java数据链--单链表

主要是要看懂这张图:


一个链表中有许多类似的节点,所以有必要用一个描述节点的类来表达节点,这个类我们称为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();
	}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值