动态链表的生成和
初衷💁🏻
做这系列主要是看自己在重新回过头来学习数据结构和算法,到底可以掌握到什么程度,昨天进行了反思和思考,并且前三天尝试做了下leetcode上的学习计划的题目,刷题刷不出来,动态规划,二叉树,这些基本的数据结构还是不会,非常抗拒有要从基本的链表开始学习,感觉很费时间,但是有有点欲速则不达的问题,基础不牢地动山摇,还是一点一点的慢慢自我迭代吧,这次一定要数据结构这个硬骨头啃下了,至少后面要找到刷题的感觉,上半年已经过完了,目标就是日更一下关于自己对数据结构的学的程度和相关的掌握程度,从上到下从里到外,其实七七八八都掌握的差不多了,但是刷题还是有问题,还是从头在来一遍,我相信我可以坚持下去的!!
动态数组
学习数据结构首先上了来的就是ArrayList,这种大结构的千篇一律,其实已经没什么好讲的了,但是我只作为个人记录还是从新在梳理一遍过程,从线性表到链表在到树在到图,如果不连贯,横叉或者斜插这种跳跃是的学习,我感觉我的智商也接不住,还是线下的慢慢来吧,反正今年也没什么事可做了,也摒弃了之前的学习新技术的路线了,夯实一下内力,慢慢的积累。
其实JAVA中的数组,通过int[] arr=new int[];这种方式创建的数组,都是固定长度的,基本上内容不可变,其实在工作中我也发现了,用到数组的几率可以说少之又少,基本上都是List配合Sream流,在配合Map,然后在配合JSON各种解析的骚操作,奈何数据结构第一章总是从ArrayList开始的,那咱也从数据结构的源头,数组到线性表开始!
实现效果
下面是我的写的一些代码的逻辑,其实用的时候我也结合了一些实际的场景去思考了下,主要的实际的应用场景,这个写的动态数组,其实就是去抄List的实现方法,后面其实也没有深入的思考,那都用List,那数组有啥优势呢,动不动就动态数组越界了,好像也没啥优势,这个存疑吧,这个问题我也不知道有啥优势,反正咱就是在工作中用的List情况非常多,动不动就是List,所以我设计的动态数组,也是根据List几个常用的方法来的。首先是
public int size();
public boolean isEmpty();
public void clear();
public int indexOf();
public boolean contains(int element);
public int get (int index);
public int set (int index,int element);
基本就这大致几个方法,非常的简单没啥难度,这里面我今天先是用简单int进行了替代后面,会在演进用泛型来进行替换,这里面其实也是简单迭代演进,我也做不懂一次性直接整个泛型处理;下面是贴的一些部分代码的实现;
public class ArrayList_01 {
private int size ;
private int[] elements;
private final static int DEFAULT_CAPACITY=10;
private final static int NOT_FOUND=-1;
public ArrayList_01(int capacity){
capacity= capacity<= DEFAULT_CAPACITY?DEFAULT_CAPACITY:capacity;
elements = new int[capacity];
}
public ArrayList_01(){
this(DEFAULT_CAPACITY);
}
public int size (){
return size;
}
public boolean isEmpty(){
return size == 0;
}
public void clear(){
size = 0;
}
public int indexOf(int element){
for (int i = 0; i < size; i++) {
if (elements[i] == element) return i;
}
return NOT_FOUND;
}
public boolean contain(int element){
return indexOf(element)!=NOT_FOUND;
}
public int get(int index){
if (index < 0 || index> size){
throw new IndexOutOfBoundsException("Index"+index+",Size"+ size);
}
return elements[index];
}
public int set (int index, int element){
if (index < 0 || index> size){
throw new IndexOutOfBoundsException("Index"+index+",Size"+ size);
}
int olde=elements[index];
elements[index]=element;
return olde;
}
说来惭愧,如此简单的代码,竟然我也需要记录,有点愧对于工作这么多年了,但是,看了很多大佬写的博客,要想做到日更博客和推文是一件非常非常困难的事情,我也没有很多的能力去维护每天的学习的日常和相关的记录,本来想记录每天刷leetcode相关的记录的,奈何尝试了一下,都变成直接复制答案粘贴过来,没有任何收获。你要说,我粘贴这么简单的代码有什么用不是也没什么用,谁还写这代码啊,其实我觉得,数据结构这个东西,主要还是用简单的框架来实现一些比较难的业务操作,主要是把困难分解成不同步骤的小问题的操作。你要一开始直接给我说写一个动态扩容的动态数组,那我估计我要想很长时间,到最后其实巴拉巴拉还是抄的List的源码,有啥意义,就是吧这个动态扩容这个动态数组,这个大问题,一点点分解,分解,需要size(),get(),set(),clear(),add(),这些方法吧,你有了这些方法不就可以自动扩容了么,主要还是思维很重要,先从简单的慢慢来吧,每天还要上班,上一天班那么累,还要在学习新知识,还要在输出,在记录,一点点积累吧。希望可以做到日更!
积累,专注,持之以恒!!
2023.06.30