Jakarta EE(原J2 EE)菜鸟之LinkedList的增删改查

小编 2026-06-19 阅读:131 评论:0
对LinkedList进行增删改查 LinkedList是双向链表,实现了List的接口的容器类,存储数据使用的是地址,始终铭记一点,对链表的操作就是对地址的操作,虽然有索引,但是一切都是以地...

对LinkedList进行增删改查

LinkedList是双向链表,实现了List的接口的容器类,存储数据使用的是地址,始终铭记一点,对链表的操作就是对地址的操作,虽然有索引,但是一切都是以地址为准,对数据进行添加和删除插入的操作就十分迅速。接下来我们实现以下小功能:

  1. 添加元素功能
/**首先,我们要创建一个临时指针,用于地址的指向*/
/**内部类,存值的类型*/
	class Node{
		/**创建祖宗类型变量,保存具体的值*/
		Object value;	
		/**临时指针,用于保存下一个元素的地址*/
		Node next;
		public Node(Object value) {
			super();
			this.value = value;
		}		
	}
	/**
	 * 1.添加元素功能
	 * @param ele
	 */
	public void add(Object ele){
		//添加元素方法,就是将创建好的Node对象赋值给指定node
		//判断元素是否是第一次添加,如果是,直接将创建好的Node对象赋值给node字段,如果不是则创建
		if(first == null){
			first = new Node(ele);
			size++;
		}else{
			 //将第一个地址赋给临时指针,用于遍历链表
			Node node = first;
			//查找下个地址为空元素,以便于将要添加的元素地址放上去
			while(node.next != null){
				node = node.next;
			}
			//添加新元素
			node.next = new Node(ele);
			//因为添加了新元素,所以这里需要增加地址空间
			size++;
		}
	}
  1. 打印对象
/**
	 * 打印对象,是显示具体的元素功能
	 *	覆写toString功能即可,使用StringBuilder拼接字符串
	 */
	@Override
	public String toString() {
		//定义打印元素的开头:[
		StringBuilder sb = new StringBuilder(\"[\");
		//遍历链表,拼接每一个元素,最后一个元素不用逗号隔开
		if(first == null){
			//如果当前没有元素,则直接拼接],返回
			sb.append(\"]\");
			String str = sb.toString();
			return str;
		}else{
			//将遍历到的元素地址复制临时指针node,node只会指向当前遍历到的元素
			Node node = first;
			//拼接第一个元素的值
			sb.append(node.value);
			while(node.next != null){
				//每次指向下一个元素之前,都要拼接一个,并且拼接每一个元素的值
				sb.append(\",\");
				//将指针移动到下一个元素
				node = node.next;
				//拼接当前元素的值
				sb.append(node.value);
			}
			//循环完毕后,表示所有元素已经拼接完毕
			sb.append(\"]\");
			return sb.toString();
		}
	}
  1. 返回当前元素个数
/**直接返回长度即可*/
public int size(){
		return size;
	}
  1. 查询指定索引的元素
	/**
	 * 4.查询指定索引处的元素,找到了返回元素,没找到返回一个提示
	 */
	public Object searchElementByIndex(int index){
		//索引合法性校验
		checkIndex(index);
		//遍历整链表
		if(first == null){
			return null;
		}else{
			//将遍历到的元素地址复制临时指针node,node只会指向当前遍历到的元素
			Node node = first;
			//定义计数器用来保存遍历的元素的索引
			int count = 0;
			//如果是索引是0,则返回第一个元素的值
			if(count == index){
				return node.value;
			}
			while(node.next != null){
				//将指针移动到下一个元素
				node = node.next;
				//每一次遍历都将索引+1,并且再次判断跟index关系
				if(++count == index){
					return node.value;
				}
			}
			//循环完毕后,表示所有元素遍历完毕
			return null;
		}
	}
	/**
	 * 索引合法性校验
	 * @param index
	 */
	public void checkIndex(int index){
		if(index<0 || index>size-1 ){
			throw new IllegalArgumentException(\"索引越界,索引范围:[0,\"+(size-1)+\"],而您的输入是:\"+index);
		}
	}
  1. 查询指定元素的索引
/**
	 *查询指定元素的索引,如果找到则返回索引,没找到返回-1   searchIndexByElement(Object ele)
	 */
	public Object searchIndexByElement(Object ele){			
			Node node = first;
			//判断第一个元素是否为空
			if(node.next == null && node.value.equals(ele)){
				return 0;
			}else{
				//将当前地址给临时指针,让临时指针遍历当前能遇到的元素
				int count = 0;
				//元素遍历
				while(node.next != null){
					if(node.value == ele){
						return count;
					}else if(node.equals(ele)){
						return count;
					}
					count++;
					node = node.next;
				}
			}
			return -1;			
	}
  1. 删除指定索引处的元素
	/**
	 *删除指定索引处元素方法  
	 */
	public Object deleteElementByIndex(int index){
		//索引检查
		checkIndex(index);			
		//将当前地址给临时指针
		Node node = first;
		Node preNode = null;		
		for(int i=0;i<index;i++){
			preNode = node;
			node = node.next;
		}if(index == 0){
			first = node.next;
		}else{
		preNode.next = node.next;
		}
		return null;
	}
  1. 修改指定索引处元素
	/**
	 *修改指定索引处的元素
	 */
	public Object updateElementByIndex(int index,Object ele){
		//索引检查
		checkIndex(index);
		Node node = first;
		if(index == 0){
			node.value = ele;
		}
		//判断第一个元素是否为空
		if(first == null){
			return null;
		}else{
			//将当前地址给临时指针,让临时指针遍历当前能遇到的元素			
			int count = 0;
			while(node.next != null){
				node = node.next;
				if(++count == index){
					node.value = ele;
				}				
			}
		}
		return null;
	}
  1. 将元素插入指定索引处
	/**
	 *插入指定索引处,指定的元素 
	 */
	public Object insertElementByIndex(int index,Object ele){
		//索引检查
		checkIndex(index);			
		//将当前地址给临时指针
		Node node = first;
		Node preNode = null;
		Node node2 = new Node(ele);		
		//将当前地址给临时指针,让临时指针遍历当前能遇到的元素
		for(int i=0;i<index;i++){
			preNode = node;
			node = node.next;				
		}if(index == 0){
			node2.next = first;
			first = node2;
		}else{
		preNode.next = node2;
		node2.next = node;
		}
		return 0;
}

对于LinkedList的操作,牢记一点,就是对指针指向地址的更改,在此基础上进行的增删改查插,切勿跟ArrayList操作的索引值混淆。

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表