Java数据结构之自定义实现List集合

Java自定义实现List集合

文章目录

  • Java自定义实现List集合
    • 1.数组实现
      • 1.1构建ArrayList集合
    • 2.链表实现
      • 2.1LinkedList
        • 2.1.1 构建节点
        • 2.1.2构建链表集合

题目:设计一个支持任意类型、任意长度的容器(集合),并实现增删改查的方法。

1.数组实现

1.1构建ArrayList集合

public class ArrayList {
    //定义Object类型的数组
	Object[] data ;
    //统计变量,用于统计数组元素的真实个数
	int size;
	public ArrayList() {
        //初始化长度为10
		this(10);
	}
	ArrayList(int length){
        //通过构造方法指定数组的长度
		data = new Object[length];
	}
    	//长度
	public int getLength(){
		return size;
	}
    //为了方便看效果,我们覆写toString()方法
    //为了打印真实的数组内容,除去空余的默认值
    @Override
	public String toString() {
        //构建一个新的数组,长度为size
		Object[] newdata = new Object[size];
        //将data中的元素拷贝到新数组中
		System.arraycopy(data, 0, newdata, 0, size);
        //利用Arrays类,将数组转换成字符串
		return Arrays.toString(newdata);
	}
	//增
	void add(Object obj){
        //如果数组满了
		if(size>=data.length){
            //构建一个新的数组,容量默认增加10
			Object[] newdata = new Object[data.length+10];
            //将原来的数组内容拷贝到扩容后的数组中
			System.arraycopy(data, 0, newdata, 0, size);
		}
        //将新增的元素添加在数组的末尾
		data[size] = obj;
        //数组真实长度自增1
		size++;
	}

	//查找指定索引处的元素;
	public Object getElementByIndex(int index){
		if(index<0||index>size){
			throw new ArrayIndexOutOfBoundsException("数组越界了,索引范围是:0~"+(size-1));
		}
		return data[index];
	}
	//查找指定元素第一次出现的索引
	public int getFirstIndexByElement(Object obj){
		for (int i = 0; i < size; i++) {
			if(obj.equals(data[i])){
				return i;
			}
		}
		return -1;//没有找到
	}
    //删除指定索引处的元素
	public void deleteElementByIndex(int index){
		if(index<0||index>size){
			throw new ArrayIndexOutOfBoundsException("数组越界了,索引范围是:0~"+(size-1));
		}
		System.arraycopy(data, index+1, data, index, size-index-1);
		size--;
	}
	//删除指定的第一个元素
	public void deleteFirstElement(Object obj){
		int index = getFirstIndexByElement(obj);
		System.out.println(index);
		deleteElementByIndex(index);
	}	
}

2.链表实现

2.1LinkedList

2.1.1 构建节点

public class Node {
	//节点的数据域
	Object data;
	//节点的next指针
	Node next;
	//构造方法,将数据值保存到节点的数据域
	public Node(Object data) {
		this.data = data;
	}
}

2.1.2构建链表集合

public class LinkedListDemo {
	//第一个节点
	Node first;
    //覆写toString方法,格式化输出数据
	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder("[");
		//构建一个指针指向第一个节点
		Node temp = first;
		//循环遍历链表
		while(temp!=null){
			//如果当前节点的next指针不为空,将节点的数据取出,拼接到字符串中
			if(temp.next!=null){
				sb.append(temp.data).append(",");
			}else{
				//如果当前节点的next指针为空,将节点的数据取出,并拼接一个结束符号
				sb.append(temp.data).append("]");
			}
			//将指针后移一位
			temp = temp.next;
		}
		return sb.toString();
	}
	//增
    void add(Object obj){
		//将数据封装到节点对象中
		Node node = new Node(obj);
		//如果第一个节点为空
		if(first==null){
			//将传入的节点作为第一个节点
			first = node;
		}else{
			//新建一个指针指向第一个节点
			Node temp = first;
			//如果节点的next指针不为空,说明不是链表的最后一个节点,将指针继续向下移动
			while(temp.next!=null){
				temp = temp.next;
			}
			//将传入的新节点添加在链表的末尾
			temp.next = node;
		}
	}
}

注:链表实现中增删改查只实现了增加元素的操作。

你可能感兴趣的:(JavaSE)