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

导读:本篇文章讲解 Jakarta EE(原J2 EE)菜鸟之LinkedList的增删改查,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

对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操作的索引值混淆。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/75272.html

(0)

相关推荐

半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!