欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java自定义链表结构

程序员文章站 2022-05-11 23:13:29
...

创建简单链表类,可以声明为内部类,和外部类一般声明的为 Node 节点。节点里可以包含 元素 在这里我就定义为 E 泛型

不过一般都是声明的内部类该类用户不需要知道他是什么

Node --> Node --> Node --> Node... 

package com.Test;
/**
 * 
 * @author XiaoTian
 * @date 2018-08-02
 * @param <E>
 */
//E 为泛型
public class NodeList<E> {
	
	//内部类
	class Node {
		//E 就是所为的value 
		public E e;
		/**
		 * 这里是关键
		 * 在原本的类里声明本身就能形成链表结构
		 */
		public Node next;
		//构造器
		public Node() {
			this(null, null);
		}
		/**
		 * 传入参数
		 * @param e
		 */
		public Node(E e) {
			this(e, null);
		}
		/**
		 * 传入参数
		 * @param e
		 * @param node
		 */
		public Node(E e, Node node) {
			this.e = e;
			this.next = node;
		}

		// 添加子节点
		public void addNode(Node node) {
			//判断当前节点是否为空,为空就进行添加
			if (this.next == null) {
				this.next = node;
			} else {
				next.addNode(node);
			}
		}

		// 查询某个节点
		public boolean searchNode(E e) {
			//当前元素是否存在 存在就返回
			if (this.e.equals(e)) {
				return true;
			} else if (this.next != null) {
				//不存在就进行本的下一个节点继续查询
				return this.next.searchNode(e);
			}
			return false;
		}

		// 删除
		public void remove(Node node, E e) {
			//当前元素是否存在 存在就返回
			if (this.e.equals(e)) {
				node.next = this.next;
				sizo--;
			} else {
				//不存在就进行本的下一个节点继续删除
				this.next.remove(this, e);
			}
		}

		// 打印输出
		@Override
		public String toString() {
			StringBuilder s = new StringBuilder();
			Node cur = this;
			while (cur != null) {
				s.append(cur.e + "->");
				cur = cur.next;
			}
			s.append("NULL");
			return s.toString();
		}
	}
	
	// 根节点
	private Node root;
	
	//大小
	private int sizo;

	// 添加节点
	public void add(E e) {
		Node node = new Node(e);
		if (this.root == null) {
			root = node;
			
		} else {
			root.addNode(node);
		}
		sizo++;
	}
	
	//添加头部节点
	public void addHead(E e) {
		Node node = new Node(e);
		if(this.root == null) {
			this.root = node;
		}else {
			node.next = this.root;
			this.root = node;
		}
		sizo++;
	}
	
	// 删除节点
	public void remove(E e) {
		//判断当前链表是否存在 e 
		if (search(e)) {
			this.root.remove(root, e);
		}
	}

	// 查询节点
	public boolean search(E e) {
		//递归调用查询
		return this.root.searchNode(e);
	}

	// 大小
	public int getSizo() {
		return sizo;
	}

	// 输出
	@Override
	public String toString() {
		return root.toString();
	}
}
class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		NodeList<Integer> nodeList = new NodeList<>();
		for (int i = 0; i < 30; i++) {
			nodeList.add(i);
		}
		System.out.println(nodeList+"查询"+nodeList.search(5)+"大小"+nodeList.getSizo());
		nodeList.remove(5);
		System.out.println(nodeList+"查询"+nodeList.search(5)+"大小"+nodeList.getSizo());
		nodeList.add(5);
		System.out.println(nodeList+"查询"+nodeList.search(5)+"大小"+nodeList.getSizo());
		nodeList.addHead(-1);
		System.out.println(nodeList+"查询"+nodeList.search(5)+"大小"+nodeList.getSizo());
	}
}

运行的结果

Java自定义链表结构

 链表结构当你在添加节点的时候是在最后一个节点添加的

结构是这样的

对象里有对象 -->对象 -->对象 --> 这样的规则

你明白了吗。一个简单的列表就实现了

相关标签: sa'