专栏首页FREE SOLOJava单向链表实现

Java单向链表实现

package com.pku.wuyu.io;
class Link{		// 链表的完成类
	class Node{	// 保存每一个节点,此处为了方便直接定义成内部类
		private String data ;	// 保存节点的内容
		private Node next ;		// 保存下一个节点
		public Node(String data){
			this.data = data ;		// 通过构造方法设置节点内容
		}
		public void add(Node newNode){		// 将节点加入到合适的位置
			if(this.next==null){			// 如果下一个节点为空,则把新节点设置在next的位置上
				this.next = newNode ;
			}else{		// 如果不为空,则需要向下继续找next
				this.next.add(newNode) ;
			}
		}
		public void print(){
			System.out.print(this.data + "\t") ;	// 输出节点内容
			if(this.next!=null){		// 还有下一个元素,需要继续输出
				this.next.print() ;	// 下一个节点继续调用print
			}
		}
		public boolean search(String data){	// 内部搜索的方法
			if(data.equals(this.data)){		// 判断输入的数据是否和当前节点的数据一致
				return true ;
			}else{	// 向下继续判断
				if(this.next!=null){	// 下一个节点如果存在,则继续查找
					return this.next.search(data) ;	// 返回下一个的查询结果
				}else{
					return false ;		// 如果所有的节点都查询完之后,没有内容相等,则返回false
				}
			}
		}
		public void delete(Node previous,String data){
			if(data.equals(this.data)){	// 找到了匹配的节点
				previous.next = this.next ;	// 空出当前的节点
			}else{
				if(this.next!=null){	// 还是存在下一个节点
					this.next.delete(this,data) ;	// 继续查找
				}
			}
		}
	};
	private Node root ;		// 链表中必然存在一个根节点
	public void addNode(String data){	// 增加节点
		Node newNode = new Node(data) ;	// 定义新的节点
		if(this.root==null){			// 没有根节点
			this.root = newNode ;	// 将第一个节点设置成根节点
		}else{		// 不是根节点,放到最后一个节点之后
			this.root.add(newNode) ;	// 通过Node自动安排此节点放的位置
		}
	}
	public void printNode(){		// 输出全部的链表内容
		if(this.root!=null){		// 如果根元素不为空
			this.root.print() ;	// 调用Node类中的输出操作
		}
	}
	public boolean contains(String name){	// 判断元素是否存在
		return this.root.search(name) ;	// 调用Node类中的查找方法
	}
	public void deleteNode(String data){		// 删除节点
		if(this.contains(data)){	// 判断节点是否存在
			// 一定要判断此元素现在是不是根元素相等的
			if(this.root.data.equals(data)){	// 内容是根节点
				this.root = this.root.next ;	// 修改根节点,将第一个节点设置成根节点
			}else{
				this.root.next.delete(root,data) ;	// 把下一个节点的前节点和数据一起传入进去
			}
		}
	}
};
public class Demo01{
	public static void main(String args[]){
		Link l = new Link() ;
		l.addNode("A") ;		// 增加节点
		l.addNode("B") ;		// 增加节点
		l.addNode("C") ;		// 增加节点
		l.addNode("D") ;		// 增加节点
		l.addNode("E") ;		// 增加节点
		System.out.println("======= 删除之前 ========") ;
		l.printNode() ;
		// System.out.println(l.contains("X")) ;
		l.deleteNode("C") ;		// 删除节点
		l.deleteNode("D") ;		// 删除节点
		l.deleteNode("A") ;		// 删除节点
		System.out.println("\n====== 删除之后 =========") ;
		l.printNode() ;
		System.out.println("\n查询节点:" + l.contains("B")) ;
	}
};

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 北京大学hadoop考试复习重点

    1.Hdfs和Mapreduce核心 2.扩展存储Hbase,MDB 3.搭建平台的思路(平台堆栈) 4.分布式协调 zookeeper 5.分布式概念...

    葆宁
  • 二叉树中序遍历

    二叉树是一种排序的基本的数据结构,而如果要想为多个对象进行排序,那么就必须可以区分出对象的大小,那么就必须依靠Comparable接口完成。 二叉树的基本原理...

    葆宁
  • 有哪些方法可以在运行时动态生成一个Java类?

    我们可以从常见的 Java 类来源分析,通常的开发过程是,开发者编写 Java 代码,调用 javac编译成 class 文件,然后通过类加载机制载入 JVM,...

    葆宁
  • PHP二叉树(二):二叉搜索树

    琯琯
  • 编程知识科普--解释性语言和编译型语言的区别和不同

    浩Coding
  • 写给设计师的移动页面适配小知识

    话说从设计稿到前端页面实现,是产品流程中非常重要的一环,这个阶段决定了设计师设计的设计稿能否完美地变成真正的产品雏形。废话不多说,本文主要介绍以下三块内容:移动...

    姬小光
  • TypeScript学习笔记之类

    TypeScript的类,简单地定义如下: class Person { x: number; // 默认为public类型 y: ...

    用户1141560
  • 动效设计原理:从卡通动画到UI动效 - 腾讯ISUX

    腾讯ISUX
  • 【前端】Javascript高级篇-tab切换栏(案例1)

    为节约时间选择性实现,后续大家感兴趣可以看教程了解跟进 https://www.bilibili.com/video/BV1YJ411L75N?p=14

    瑞新
  • 动效设计原理:从卡通动画到UI动效

    作者:袁骁,腾讯SNG ISUX 用户体验设计师。热衷于研究 Emotional Design和认知心理学 UI是基于静态页面来设计的,页面之间通过跳转切换。在...

    腾讯大讲堂

扫码关注云+社区

领取腾讯云代金券