Day16-数据结构(1)

总结

我是最棒的!基础不牢,地动山摇!

数据结构

通过自己手动实现ArrayList和LinkedList的基本方法,来理解其含义

ArrayList(动态数组)查,改快

LinkedList(单向链表)插入,删除快

ArrayList

package cn.itsource.arraylist;

import java.util.Arrays;


/**
 *	     	3. 需求:
 *			1. 设计一个类可以保存多个任意类型的数据(基于Object数组)
 *			2. 可以任意添加任意类型的数据 void add(Object obj)
 *						version2 自动扩容
 *			3. 可以记录当前数据的个数 int size()
 *			4. 可以打印当前数据结构的对象,格式如下:[值1,值2.。。。。]
 *
 *			5. 查询指定下标的元素  Object searchByIndex(int index)
 *			6. 查询指定的元素第一次出现的位置  int searchByElement(Object ele);
 *
 *			7. 修改指定下标处的元素  void updateByIndex(int index,Object obj)
 *			8. 删除指定下标处的元素,返回删除的元素  	Object deleteByIndex(int index)
 *			9. 删除的首次出现的指定元素     void deleteByElement(Object ele)
 *			10.插入指定下标处一个指定元素 void insertByIndex(int index,Object obj)
 *					
 *			11.将对象中所有元素清空 void clear();
 *			12.可以创建指定长度的ArrayList对象
 *			13.创建一个默认长度是10的ArrayList对象
 *			14.创建一个默认长度是10,且有指定元素的ArrayList对象
 *
 * @author tyx666
 *
 */
public class ArrayListDemo {
	private Object[] value;
	/**数组元素个数*/
	private int size;
	
	
	/**
	 * 12.可以创建指定长度的ArrayList对象
	 */
	public ArrayListDemo(int length){
		Object[] value = new Object[length];
		this.value = value;
	}
	
	public ArrayListDemo(){
		this.value = new Object[10];
	}
	
	public ArrayListDemo(Object obj){
		this.value = new Object[10];
		add(obj);
	}
	/**
	 * 添加元素
	 * @param obj
	 */
	public void add(Object obj){
		//自动扩容
		if(size >= value.length){
			value = Arrays.copyOf(value, value.length*2);
		}
		value[size] = obj;
		size++;
	}
	
	/**获取当前元素个数*/
	public int size(){
		return size;
	}
	
	/**
	 * 打印方法
	 */
	@Override
	public String toString() {
		Object[] newArr = Arrays.copyOf(value, size);
		return Arrays.toString(newArr);
	}
	
	/**
	 * 查询指定下标的元素
	 * @param index
	 * @return
	 */
	public Object searchByIndex(int index){
		if(index < 0 || index >= size){
			throw new IllegalArgumentException("数组下标不再范围内");
		}
		return value[index];
	}
	
	/**
	 * 返回一个元素第一次出现的位置
	 * @param ele
	 * @return
	 */
	public int searchByElement(Object ele){
		int index = 0;
		
		if(ele == null){
			for (int i = 0; i < value.length; i++) {
				if(value[i] == ele){
					break;
				}
				index++;
			}
		}else {
			for (int i = 0; i < value.length; i++) {
				if(ele.equals(value[i])){
					break;
				}
				index++;
			}
		}
		if(index == value.length){
			return -1;
		}
		return index;
	}
	
	/**
	 * 7. 修改指定下标处的元素  void updateByIndex(int index,Object obj)
	 */
	public void updateByIndex(int index,Object obj){
		if(index < 0 || index >= size){
			throw new IllegalArgumentException("下标范围错误");
		}
		value[index] = obj;
	}
	/**
	 * 8. 删除指定下标处的元素,返回删除的元素  	Object deleteByIndex(int index)
	 */
	
	public Object deleteByIndex(int index){
		Object obj = value[index];
		
		Object[] newArr = new Object[size-1];
		for (int i = 0; i < index; i++) {
			newArr[i] = value[i];
		}
		for(int i = index ;i<newArr.length;i++){
			newArr[i] = value[i+1];
		}
		size--;
		value = newArr;
		return obj;
	}
	/**
	 * 9. 删除的首次出现的指定元素     void deleteByElement(Object ele)
	 */
	public void deleteByElement(Object ele){
		int index = searchByElement(ele);
		deleteByIndex(index);
	}
	
	/**
	 * 10.插入指定下标处一个指定元素 void insertByIndex(int index,Object obj)
	 * @param index
	 * @param obj
	 */
	public void insertByIndex(int index,Object obj){
		checkIndex(index);
		if(size >= value.length){
			value = Arrays.copyOf(value, value.length*2);
		}
		
		System.arraycopy(value, index, value, index+1, size-index);
		size++;
		value[index] = obj;
	}
	
	/**
	 * 将对象中所有元素清空 void clear();
	 */
	public void clear(){
		value = new Object[10];
	}
	
	/**
	 * 验证下标的合法性
	 * @param index
	 */
	public void checkIndex(int index){
		if (index < 0 || index >= size) {
			throw new IllegalArgumentException("下标不在范围之内");
		}
	}
}

LinkedList

package cn.itsource.singlylinkedlist;
/**
 * 单向链表底层手动实现
 * @author tyx666
 *	 	1. 可以任意添加任意类型的数据 void add(Object obj)
 *		2. 可以记录当前数据的个数 int size()
 *		3. 可以打印当前数据结构的对象 toString(),格式如下:[值1,值2.。。。。]
 *
 *		4. 查询指定下标的元素  Object searchByIndex(int index)
 *		5. 查询指定的元素第一次出现的位置  int searchByElement(Object ele);
 *
 *		6. 修改指定下标处的元素  void updateByIndex(int index,Object obj)
 *		7. 删除指定下标处的元素,返回删除的元素  	Object deleteByIndex(int index)
 *		8. 删除的首次出现的指定元素     void deleteByElement(Object ele)
 *		9.插入指定下标处一个指定元素 void insertByIndex(int index,Object obj)
 *					
 *		11.将对象中所有元素清空 void clear();
 *
 *
 */
public class SinglyLinkedList {

	/**链表中的头*/
	private Node first;
	/**记录元素个数*/
	private int size;
	
	/**
	 * 无参构造
	 */
	public SinglyLinkedList(){
		
	}
	
	/**
	 * 有参构造
	 * @param value
	 */
	public SinglyLinkedList(Object value) {
		Node first = new Node(value);
		this.first = first;
		size++;
	}
	
	
	/**
	 * 1. 可以任意添加任意类型的数据 void add(Object obj)
	 * @param obj
	 */
	public void add(Object obj){
		//根据参数创建Node对象
		Node node = new Node(obj);
		//判断first是否为null,如果是,直接赋值
		if (first == null) {
			first = node;
		}else{
			//定义一个变量保存遍历到的位置
			Node temp = first;
			//遍历链表,直到next为null,添加进去
			while(temp.next != null){
				temp = temp.next;
			}
			temp.next = node;
		}
		size++;
	}
	
	/**
	 * 获取元素个数
	 * @return
	 */
	public int size(){
		return size;
	}
	
	/**
	 * 3. 可以打印当前数据结构的对象 toString(),格式如下:[值1,值2.。。。。]
	 */
	@Override
	public String toString() {
		//定义一个sb来拼接
		StringBuilder sb = new StringBuilder("[");
		//判断链表是否为空
		if(first == null){
			return sb.append("]").toString();
		}else {
			//定义临时变量保存位置
			Node temp = first;
			while(temp != null){
				sb.append(temp.value);
				if(temp.next != null){
					sb.append(",");
				}
				temp = temp.next;
			}
			
			sb.append("]");
			return sb.toString();
		}
	}

	 /**
	  * 4. 查询指定下标的元素  Object searchByIndex(int index)
	  * @param index
	  * @return
	  */
	 public Object searchByIndex(int index){
		 checkIndex(index);
		 //计数器
		 int count = 0;
		 //临时变量
		 Node temp = first;
		 while(temp != null){
			 if(count == index){
				 return temp.value;
			 }
			 count++;
			 temp = temp.next;
		 }
		 return null;
	 }
	 
	 /**
	  * 5. 查询指定的元素第一次出现的位置  int searchByElement(Object ele);
	  * @param ele
	  * @return
	  */
	 public  int searchByElement(Object ele){
		 if(ele == null){
			//计数器
			 int index = 0;
			 //临时变量
			 Node temp = first;
			 while(temp != null){
				 if(temp.value == ele){
					 return index;
				 }
				 temp = temp.next;
				 index++;
			 }
		 }else{
			//计数器
			 int index = 0;
			 //临时变量
			 Node temp = first;
			 while(temp != null){
				 if(temp.value.equals(ele)){
					 return index;
				 }
				 temp = temp.next;
				 index++;
			 }
		 }
		 return -1;
	 }
	 
	 /**
	  * 6. 修改指定下标处的元素  void updateByIndex(int index,Object obj)
	  * @param index
	  * @param obj
	  */
	 public void updateByIndex(int index,Object obj){
		 checkIndex(index);
		 //定义中间变量
		 Node temp = first;
		 //计数器
		 int count = 0;
		 while(temp != null){
			 if(count == index){
				 temp.value = obj;
			 }
			 count++;
			 temp = temp.next;
		 }
	 }
	 
	 /*7. 删除指定下标处的元素,返回删除的元素  	Object deleteByIndex(int index)
	 *		8. 删除的首次出现的指定元素     void deleteByElement(Object ele)
	 *		9.插入指定下标处一个指定元素 void insertByIndex(int index,Object obj)*/
	 /**
	  * 删除指定下标处的元素,返回删除的元素  	Object deleteByIndex(int index)
	  * @param index
	  * @return
	  */
	 public Object deleteByIndex(int index){
		 checkIndex(index);
		 //定义中间变量
		 Node temp = null;
		 //计数器
		 int count = 0;
		 if(index == 0){
			//将要删除的元素赋值给temp保存
			temp = first;
			//如果是要删除第一个元素,则直接将第二个元素赋值给first
			first = first.next;
			//元素个数-1
			size--;
			return temp.value;
		 }
		 while(temp != null){
			 temp = first;
			 if(count == index - 1 ){
				 Node temp2 = temp.next;
				 temp.next = temp2.next;
				 size--;
				 return temp2.value;
			 }
			 count++;
			 temp = temp.next;
		 }
		
		 return null;
	 }
	 
	 /**
	  * 8. 删除的首次出现的指定元素     void deleteByElement(Object ele)
	  * @param ele
	  */
	 public void deleteByElement(Object ele){
		int index = searchByElement(ele);
		if(index < 0){
			return;
		}
		deleteByIndex(index);
	 }
	 
	 /**
	  * 9.插入指定下标处一个指定元素 void insertByIndex(int index,Object obj)
	  */
	 public void insertByIndex(int index,Object obj){
		 checkIndex(index);
		 //创建对象
		 Node node = new Node(obj);
		 
		 //考虑在链表头
		 if(index == 0){
			 //将之前第一个元素的地址赋值给node对象
			 node.next = first;
			 //将新创建的元素地址赋值给node对象
			 first = node;
			 //元素个数-1
			 size--;
		 }
		 //中间变量
		 Node temp = first;
		 //计数器
		 int count = 0;
		 while(temp != null){
			 if(count == index - 1){
				 Node temp2 = temp.next;
				 temp.next = node;
				 node.next = temp2;
			 }
			 count++;
			 temp = temp.next;
		 }
		 
	 }
	 
	 /**
	  * 清除链表
	  */
	 public void clear(){
		 first = null;
		 size = 0;
	 }
	 
	 /**
	  * 判断下标的合法性
	  * @param index
	  */
	 public void checkIndex(int index){
		 if(index < 0 || index >= size){
			 throw new IllegalArgumentException("下标不在范围内");
		 }
	 }

	class Node{
		private Object value;
		private Node next;
		
		public Node(Object value) {
			super();
			this.value = value;
		}

		public Object getValue() {
			return value;
		}

		public void setValue(Object value) {
			this.value = value;
		}

		public Node getNext() {
			return next;
		}

		public void setNext(Node next) {
			this.next = next;
		};
		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值