Java实现简单的单向链表

链表介绍

单向链表是链表的一种,其特点是链表的链接方向是单向的,链表是使用引用进行构造的列表,因为链表是由一个个节点互相链接起来的,其中每个节点都有一个引用指向列表中的下一个节点。对链表的访问是自上往下进行遍历的,从头部开始一直遍历到链表尾部。

示意图

本次的单项链表是通过一个外部类和一个内部类来实现的,在外部类中定义了一个实现保存节点和节点数据的内部类,同时在外部类和内部类中都存在添加节点、查找节点、修改节点、删除节点和输出节点数据等方法。在外部类的操作是针对链表的根节点,而在内部类的操作都是针对除根节点以外的其他节点。

实现代码

/**
 * 单向链表实现类
 *
 * 注意事项:
 * 1.对链表节点进行增、删、改、查、输出操作。
 * 2.不能添加重复值和null值到链表中。
 *
 * 方法如下:
 * 1.查找节点 :lookupNode()
 * 2.添加节点:addNode()
 * 3.删除节点:deleteNode()
 * 4.修改节点:modifyNode()
 * 5.输出所有节点数据:printNode()
 * 6.获取到节点数量:getNodeCount()
 *
 * @author 谈笑、
 * @Date 2020-06-21
 */
public class SinglyLinkedList {

	// 定义节点对象(节点头)
	private Node head;

	private static int nodeCount;


	/**
	 * 添加结点
	 *
	 * @param data 节点数据
	 * @return 节点添加结果
	 */
	public boolean addNode(String data) {
		// 添加的节点数据不为null
		if(data != null) {
			// 该节点数据没有添加过
			if(!this.lookupNode(data)) {
				Node node = new Node(data);
				// 节点头如果为空则将节点头指向将新节点
				if(this.head == null) {
					this.head = node;
					return true;
				}else {
					// 链表的最后一个节点指定新节点
					return this.head.addNodeData(node);
				}
			}
		}
		return false;
	}


	/**
	 * 删除结点
	 *
	 * @param data 节点数据
	 * @return 节点删除结果
	 */
	public boolean deleteNode(String data) {
		// 节点头和需要删除的节点数据不为null
		if(this.head != null && data != null) {
			// 链表中存在该节点数据
			if(this.lookupNode(data)) {
				if(this.head.data.equals(data)) {
					// 将上一个节点指定下下个节点
					this.head = this.head.next;
					return true;
				}else {
					return this.head.deleteNodeData(this.head, data);
				}
			}
		}
		return false;
	}


	/**
	 * 修改节点
	 *
	 * @param data_1 需要修改的节点数据
	 * @param data_2 节点数新值
	 * @return 节点修改结果
	 */
	public boolean modifyNode(String data_1, String data_2) {
		if(this.head != null && data_1 != null && data_2 != null) {
			// 修改的节点存在,并且新节点值不能与链表中的节点数据重复
			if(this.lookupNode(data_1) && (!this.lookupNode(data_2))) {
				// 节点头的数据是否于需要修改的数据一致
				if(this.head.data.equals(data_1)) {
					this.head.data = data_2;
					return true;
				}else {
					// 遍历其他节点
					return this.head.modifyNodeData(data_1, data_2);
				}
			}
		}
		return false;
	}


	/**
	 * 查找结点
	 *
	 * @param data 节点数据
	 * @return 节点查找结果
	 */
	public boolean lookupNode(String data) {
		// 节点头和需要查询的数据不为null
		if(this.head != null && data != null) {
			// 节点头的数据是否与需要查询的数据一致
			if(data.equals(this.head.data)) {
				return true;
			}else {
				// 查询其他节点数据是否与需要查询的数据一致
				return this.head.lookupNodeData(data);
			}
		}
		return false;
	}


	/**
	 * 输出节点
	 */
	public void printNode() {
		if(this.head != null) {
			this.head.printNodeData();
			System.out.println();
		}else {
			System.out.println("[当前节点为空]");
		}
	}


	/**
	 * 获取到链表中的节点数量
	 *
	 * @return 节点数量
	 */
	public int getNodeCount() {
		if(this.head != null) {
			return this.head.getNodeCount();
		}
		return 0;
	}


	/**
	 * 内部节点类
	 *
	 * @author 谈笑、
	 * @Date 2020-06-21
	 */
	class Node {

		// 节点头
		private Node next;
		// 节点数据
		private String data;

		public Node(String data) {
			this.data = data;
		}

		/**
		 * 添加节点
		 *
		 * @param node 添加的节点
		 * @return 节点添加结果
		 */
		public boolean addNodeData(Node node) {
			if(this.next == null) {
				this.next = node;
				return true;
			}else {
				if(this.next != null) {
					return this.next.addNodeData(node);
				}
			}
			return false;
		}


		/**
		 * 删除指定的节点数据
		 *
		 * @param head 节点
		 * @param data 需要删除的节点数据
		 * @return 节点数据删除结果
		 */
		public boolean deleteNodeData(Node head, String data) {
			// 本节点的节点数据是否需要删除的节点数据一致
			if(data.equals(this.data)) {
				head.next = this.next;
				return true;
			}else {
				// 是否还有节点(是否到了链表尾部)
				if(this.next != null) {
					return this.next.deleteNodeData(this, data);
				}
			}
			return false;
		}


		/**
		 * 修改节点数据
		 *
		 * @param data_1 需要修改的节点数据
		 * @param data_2 节点数新值
		 * @return 节点修改结果
		 */
		public boolean modifyNodeData(String data_1, String data_2) {
			if(data_1.equals(this.next.data)) {
				this.next.data = data_2;
				return true;
			}else {
				if(this.next != null) {
					return this.next.modifyNodeData(data_1, data_2);
				}
			}
			return false;
		}


		/**
		 * 查询节点数据
		 *
		 * @param data 节点数据
		 * @return 查询节点数据结果
		 */
		public boolean lookupNodeData(String data) {
			// 本节点的数据是否于需要查询的数据是否一致
			if(data.equals(this.data)) {
				return true;
			}else {
				// 下一个节点不为null
				if(this.next != null) {
					// 递归遍历节点数据
					return this.next.lookupNodeData(data);
				}
			}
			return false;
		}


		/**
		 * 输出节点数据
		 */
		public void printNodeData() {
			System.out.print(this.data + "  ");
			if(this.next != null) {
				this.next.printNodeData();
			}
		}


		/**
		 * 返回链表中的节点数量
		 *
		 * @return 节点数量
		 */
		public int getNodeCount() {
			SinglyLinkedList.nodeCount += 1;
			if(this.next != null) {
				this.next.getNodeCount();
			}
			return SinglyLinkedList.nodeCount;
		}

	}

	public static void main(String[] args) {

		// 实例化节点类
		SinglyLinkedList list = new SinglyLinkedList();

		// 添加五个节点
		System.out.println("### 添加节点 ###");
		System.out.println(list.addNode("丙"));
		System.out.println(list.addNode("乙"));
		System.out.println(list.addNode("丁"));
		System.out.println(list.addNode("甲"));
		System.out.println(list.addNode(null));
		System.out.println(list.addNode("戊"));

		// 获取到节点长度
		System.out.println(list.getNodeCount());

	}

}

相关文件

SinglyLinkedList.zip

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
下一篇