首页 > 其他分享 >12.9 链表 - 综合汇总----???

12.9 链表 - 综合汇总----???

时间:2023-07-05 10:04:01浏览次数:51  
标签:---- return 数据 节点 链表 12.9 data public

demo 本章节综合汇总信息,在这个demo都可以体现----看的有点懵~!!~


interface ILink<E> {									// 链表公共标准
	/**
	 * 向链表中进行数据的存储,每个链表所保存的数据类型相同,不允许保存null数据
	 * @param e 要保存的数据
	 */
	public void add(E e);
	/**
	 * 获取链表中集合元素的保存个数
	 * @return 元素个数
	 */
	public int size() ; 
	/**
	 * 判断当前是否为空链表(长度为0 )
	 * @return 如果是空链表返回true,否则返回false
	 */
	public boolean isEmpty();
	/**
	 * 获取链表中的全部内容,该内容将以数组的形式返回
	 * @return 如果链表有内容则返回与保存元素个数相当的数组,如果没有内容保存返回null
	 */
	public Object[] toArray() ;
	/**
	 * 根据索引获取链表中的指定元素内容
	 * @param index 要获取元素的索引
	 * @return 指定索引位置的数据
	 */
	public E get(int index) ;
	/**
	 * 修改指定索引中的数据内容
	 * @param index 要修改的数据索引
	 * @param data 要替换的新内容
	 */
	public void set(int index, E data);
	/**
	 * 查询指定内容是否存在,要求查询对象所在类覆写equals()方法
	 * @param data 要查找的数据
	 * @return 数据存在返回true,否则返回false
	 */
	public boolean contains(E data);
	/**
	 * 删除指定内容的数据,需要利用equals()方法进行比较
	 * @param data 要删除的数据
	 */
	public void remove(E data);
	/**
	 * 清空链表中的所有元素
	 */
	public void clean();
}


class LinkImpl<E> implements ILink<E> {


	// 使用内部类的结构进行定义,这样外部类与内部类可以直接进行私有成员访问
	private class Node<E> {								// 内部类封装,对外部不可用
		private E data;									// 节点保存数据
		private Node<E> next;							// 保存节点引用----???
		public Node(E data) {							// 创建节点时保存数据
			this.data = data;
		}
		/**
		 * 保存新创建的节点,保存的依据是判断当前节点的next属性是否为空
		 * @param newNode 要保存的新节点
		 */
		public void addNode(Node<E> newNode) { 			// 保存新的Node数据
			if (this.next == null) { 					// 当前节点的下一个节点为null
				this.next = newNode; 					// 保存当前节点
			} else {
				this.next.addNode(newNode);				// 递归到合适的位置保存数据
			}
		}
		/**
		 * 将链表中的全部元素保存到对象数组之中
		 */
		public void toArrayNode() {
			// 将当前节点的数据取出保存到returnData数组之中,同时进行索引自增
			LinkImpl.this.returnData[LinkImpl.this.foot++] = this.data;
			if (this.next != null) { 					// 还有下一个数据
				this.next.toArrayNode();				// 递归调用
			}
		}
		/**
		 * 根据节点索引获取元素
		 * @param index 要获取的索引编号,该索引编号一定是有效编号
		 * @return 索引对应的数据
		 */
		public E getNode(int index) {
			if (LinkImpl.this.foot++ == index) { 		// 索引相同
				return this.data; 						// 返回当前数据
			} else {									// 继续向后获取数据
				return this.next.getNode(index);
			}
		}
		/**
		 * 修改指定索引对应的数据内容
		 * @param index 要修改的索引
		 * @param data 要替换的内容
		 */
		public void setNode(int index, E data) {
			if (LinkImpl.this.foot++ == index) { 		// 索引相同
				this.data = data; 						// 修改数据
			} else {
				this.next.setNode(index, data);			// 后续节点操作
			}
		}
		/**
		 * 判断指定的数据是否存在
		 * @param data 要查找的数据
		 * @return 数据存在返回true,否则返回false
		 */
		public boolean containsNode(E data) {
			if (this.data.equals(data)) { 				// 对象比较
				return true;							// 数据存在
			} else {
				if (this.next == null) { 				// 没有后续节点
					return false; 						// 没有找到数据
				} else { 								// 后续节点判断
					return this.next.containsNode(data);
				}
			}
		}
		/**
		* 删除指定数据对应的节点内容
		* @param previous 要删除节点的上一个节点
		* @param data 要删除的数据
		*/
		public void removeNode(Node previous, E data) {
			if (this.data.equals(data)) {				// 数据内容比较
				previous.next = this.next; 				// 【删除】空出当前节点
			} else {									// 数据内容不匹配
				if (this.next != null) { 				// 有后续节点
					this.next.removeNode(this, data); 	// 向后继续删除
				}
			}
		}

	}





	// --------------- 以下为Link类中定义的结构 ------------------
	private Node<E> root ;							// 保存根节点信息 
	private int count ; 							// 保存元素个数
	private int foot; 								// 数组操作脚标
	private Object[] returnData; 					// 返回数据保存

	@Override
	public void add(E e) {							// 方法覆写							
		if (e == null) { 							// 保存的数据为nul时
			return; 								// 方法调用直接结束
		}
		// 数据本身是不具有节点先后的关联特性的,要想实现关联处理就必须将数据包装在Node类之中
		Node<E> newNode = new Node<E>(e); 			// 创建一个新的节点
		if (this.root == null) { 					// 现在没有根节点
			this.root = newNode; 					// 第一个节点作为根节点
		} else { 									// 根节点存在
			this.root.addNode(newNode);				// 由Node类保存新节点
		}
		this.count ++ ; 							// 保存元素个数自增
	}

	@Override
	public int size() {
		return this.count;							// 返回元素个数
	}

	@Override
	public boolean isEmpty() {
		return this.count == 0;						// 判断集合长度是否为0
	}
	
	@Override
	public Object[] toArray() {
		if (this.isEmpty())	{						// 空集合
			throw new NullPointerException("集合内容为空") ;
		}
		this.foot = 0 ; 							// 脚标清零
		this.returnData = new Object [this.count] ;	// 根据已有长度开辟数组
		this.root.toArrayNode() ;					// 利用Node类进行递归数据获取
		return this.returnData ;					// 返回全部元素
	}
	
	@Override
	public E get(int index) {
		if (index >= this.count) { 					// 索引不在指定的范围之内
			throw new ArrayIndexOutOfBoundsException("不正确的数据索引");
		}
		this.foot = 0; 								// 重置索引的下标
		return this.root.getNode(index);			// 交由Node类查找
	}
	
	@Override
	public void set(int index, E data) {
		if (index >= this.count) { 					// 索引不在指定的范围之内
			throw new ArrayIndexOutOfBoundsException("不正确的数据索引");
		}
		this.foot = 0; 								// 重置索引的下标
		this.root.setNode(index, data); 			// Node类修改数据
	}
	
	@Override
	public boolean contains(E data) {
		if (data == null) {
			return false; 							// 没有数据返回false
		}
		return this.root.containsNode(data); 		// 交由Node类判断 
	}
	
	@Override
	public void remove(E data) {
		if (this.contains(data)) { 					// 判断数据是否存在
			if (this.root.data.equals(data)) { 		// 根节点为要删除节点
				this.root = this.root.next; 		// 修改根节点引用
			} else { 								// 交由Node类负责删除
				this.root.next.removeNode(this.root, data);
			}
			this.count--;							// 元素数量减少 
		}
	}
	
	@Override
	public void clean() {
		this.root = null ; 							// 断开根节点引用
		this.count = 0 ; 							// 元素个数清零
	}
}

public class JavaDemo {
	public static void main(String args[]) {
		ILink<String> link = new LinkImpl<String>();	// 实例化链表对象
		//System.out.println("数据保存前链表元素个数:" + link.size());
		link.add("魔乐科技软件学院");						// 链表中保存数据
		link.add("www.mldn.cn");						// 链表中保存数据
		link.add("www.yootk.com");						// 链表中保存数据
		System.out.println(link.contains("www.mldn.cn"));	// 数据查询
		System.out.println(link.contains("张老师"));	// 数据查询

		//System.out.println("数据保存后链表元素个数:" + link.size());
//		Object results [] = link.toArray() ;			// 获取全部保存数据
//		for (Object obj : results) {
//			String str = (String) obj ;					// 确定为String类型,强制转型
//			System.out.print(str + "、");				// 输出对象
//		}
//		link.set(1, "魔乐科技软件学院(MLDN):www.mldn.cn");	// 修改内容
//		System.out.println(link.get(1));				// 获取第2个元素
//		System.out.println(link.get(3));				// 错误的索引
	}
}

标签:----,return,数据,节点,链表,12.9,data,public
From: https://www.cnblogs.com/pansidong/p/17527737.html

相关文章

  • sqlserver 逗号分隔的字段为多条数据
     写一个函数:ALTERfunction[dbo].[f_split](@cvarchar(max),@splitvarchar(2))returns@ttable(colvarchar(50))asbeginwhile(charindex(@split,@c)<>0)begininsert@t(col)values(substring(@c,1,charindex(@split,@c)-1))set@c=stuff(@c......
  • Sentieon | 每周文献-Genetic Disease-第二期
    遗传病系列文章-1标题(英文):AnswerALS,alarge-scaleresourceforsporadicandfamilialALScombiningclinicalandmulti-omicsdatafrominducedpluripotentcelllines标题(中文):AnswerALS,一种用于散发性和家族性ALS的大规模资源,结合了来自诱导多能细胞系的临床和多......
  • 事件修饰符
    使用场景:在一些需要对某些事件进行阻止默认事件或者冒泡等等类似的操作的时候,就需要进行一定的处理,Vue为v-on提供了事件修饰符。修饰符是用.表示的指令后缀。包含以下这些:.stop//.prevent//.self//.capture//捕获.once//.passive//另外,修饰语可......
  • __main和主函数main()区别++++修改主函数名称的方法
    一、__main和main()之间的关系startup__ec618.s启动文件里面的Reset_Handler: 调用过程: stm32在启动后先进入重启中断函数Reset_Handler,其中会先后调用SystemInit和__main函数,__main函数属于c库函数,其内部依次进行三步工作,即先初始化rw段,然后初始化zi段,最后调用另一......
  • Sentieon | 每周文献-Population Sequencing-第一期
    群体基因组系列文章-1标题(英文):TheImpactofACEsonBMI:AnInvestigationoftheGenotype-EnvironmentEffectsofBMI标题(中文):ACEs对BMI的影响:探究BMI的基因型-环境效应发表期刊:BehaviorGenetics作者单位:美国俄勒冈州立大学心理学系发表年份:2022文章地址:https://doi.......
  • Sentieon实战:NGS肿瘤变异检测流程
      肿瘤基因突变检测是NGS的一个重要应用,其分析难点主要在于低频变异的准确性。不同于遗传病检测,肿瘤样本类型多样,测序方法和参数复杂,且缺乏对应各种场景的公共标准真集。再加上常用开源软件经常遇到的准确性低,稳定性差,速度慢等问题。这使得广大诊断公司在评估肿瘤变异检测工具......
  • 加速体细胞突变检测分析流程-系列2(ctDNA等高深度样本)
    Sentieon●体细胞变异检测系列-2  Sentieon致力于解决生物信息数据分析中的速度与准确度瓶颈,通过算法的深度优化和企业级的软件工程,大幅度提升NGS数据处理的效率、准确度和可靠性。 针对体细胞变异检测,Sentieon软件提供两个模块:TNscope和TNhaplotyer2。 TNscope:此模......
  • 体细胞突变检测分析流程-系列1( WES&Panel)
    Sentieon●体细胞变异检测-系列1 Sentieon致力于解决生物信息数据分析中的速度与准确度瓶颈,通过算法的深度优化和企业级的软件工程,大幅度提升NGS数据处理的效率、准确度和可靠性。 针对体细胞变异检测,Sentieon软件提供两个模块:TNscope和TNhaplotyer2。 TNscope:此模块......
  • Sentieon | 每周文献-Tumor Sequencing-第三期
     肿瘤测序系列文章-1标题(英文):Therelationshipbetweengeneticcharacteristicsandclinicalcharacteristicsandtheefficacyof 131Itherapyinchildrenandadolescentswithlocallyadvancedormetastaticdifferentiatedthyroidcancer标题(中文):局部晚期或......
  • 8086汇编语言精讲2 :寄存器
        mov就是赋值;add就是+=; 为什么044CH(0可去,因为是高位补的0),也就是44CH<十六进制数在十六位下最大数FFFFH(也就是16=2^4)=65535D(D指的十进制,H指的十六进制),所以是不算溢出,因为C本来就是十六位进制中的一个位值,和1-9是一样的.Tips:如果使用十进制中的数代......