数据结构(data structure)(1)链表和线性表

 类和对象

对象将数据和操作打包在一起,类描述了这一切
用构造器创建(实例化)对象
类和类之间的关系
-关联(组合,聚集)
-泛化private class Student{protected String name;protected int age;protected int ability;public Student(String name,int age){this.name=name;this.age=age;}
4public  void study(){ability++;}public String toString(){return "Student{"+"name="+name+'\''+",age"+age+",ability="+ability+'}';}public boolean equals(Object o){if(this==o)return true;if(o==null||getClass()!=o.getClass())return false;Student student =(Student)o;return name.equals(student.name);}public static void main(String[] args){Student stu1=new Student();Student stu2=new Student();System.out.println(stu1.toString());System.out.println(stu1.equal(stu2));}
}

关于继承

祖先类Object
方法重写
toString方法
equals方法public class CleverStudent extends Student{public CleverStudent(String name,int age){super(name,age);}public void study(){super.study();super.study();}public void study(int s){ability+=s;}
}Comparable接口,比较大小
Comparator接口,比较器
Cloneable接口,克隆
seriazable接口,可序列化,io接入网路需要

数据结构基本概念

数据(data)
数据元素(data element)
数据对象(data object)数据是一种泛指数据对象
数据元素
数据项(数据对象)student
{(name(数据项),age)   (数据元素)
}

数据结构(data structure)

辑结构
集合:元素罗列在一起
线性结构:元素前后相继(一一对应)
树形结构:(元素存在一对多的关系)
图结构或网状结构:元素之间存在多对多的结构存储结构
-顺序存储:地址连续,用数组
-链式存储:地址不连续,用指针(引用,面向对象)Create建立
Destroy消除
Delete删除
Insert插入
Access访问
Modify修改
Sort排序
Search查找
增删改查排历

 列表:顺序表和链表

定义列表接口
用数组实现列表-MyArrayList
实现列表
Java List API

 顺序表

public interface MyList{//新增一个元素void add(Object element);//删除相同元素void delete(Object element)//根据索引删除元素void delete(int index);//将指定索引位置的·元素替换成新元素void update(int index,Object newElement);//当前列表中是否含有target元素boolean contains(Object target);//返回指定索引处元素Object indexOf(int index);}public class MyArrayList implements MyList{private int size=0//元素个数private int capacity;//容量public MyArrayList(int capacity){this.capacity=capacity;elements=new Object[capacity];
}//新增一个元素void add(Object element){if(size==capacity)//扩容{capacity*=2;//增加一倍的容量Object[] newArr=new Object[capacity];//把旧的柜子扔掉newArr[i]=elements[i];}elements[size++]=element;}//删除相同元素void delete(Object element){int index=indexOf(element);if(index>=0){delete(index);}}//根据索引删除元素void delete(int index){for(int i=index;i<size;i++){elements[i]=elements[i+1];}size--;}//将指定索引位置的·元素替换成新元素void update(int index,Object newElement){elemenyts[index]=newElement;}//当前列表中是否含有target元素boolean contains(Object target){}//返回指定索引处元素Object at(int index){return elements[index];}//查找element的索引,如果没有返回-1Object indexOf(Object element){for(int i=0;i<size;i++){if(elements[i].equals(element))return i;}return -1;}public String toString(){StringgBuilder sb=new StringBuilder("[");for(int i=0;i<size;i++){sb.append(elements[i]+(i==size-1?"":","));}sb.appen("]");return sb.toString();}}publi class MyArraylistTest{public  void add() throw Exception{MyArrayList list=new MyArrayList();list.add("nike");List.add("addidiaos");List.add("nb");}}

单链表

head头节点,Node[data,point]->[data,point]->[]->[]public class ListNode{private Object data;private ListNode next;public ListNode(data){this.data=data;}}public class SingleLinkedList implements Mylist{private ListNode first;//头节点private ListNode last;//尾节点public void add(Object element){if(first==null){//如果头节点为空,将新增节点给头节点first=new ListNode(element);last=head;//此时尾节点等于头节点}else{last.next=new ListNode(element);//新增节点last=last.Next;//尾节点更新到新增的一个节点位置上}size++;
}//新增一个元素//删除相同元素public  void delete(Object element){ListNode p=first;ListNode pre=null;//p前面的位置while(p!=null){if(p.data.equals(element)){if(p==first){//如果删除头指针元素,让头指针往后挪一位就可以了first=first.next;}pre.next=p.next;break;}pre=p;//等于p的位置,p再移动一位,pre就在p的前面了p=p.next;}size--;}//根据索引删除元素public void delete(int index){if(index<0||index>size){return;//啥也不干}int i=0;ListNode p=first;ListNode pre=null;while(p!=null){if(i==index){if(p==first){first=first.next;}else{pre.next=p.next;}break;}pre=p;p=p.next;i++;}、size--;}//将指定索引位置的·元素替换成新元素public void update(int index,Object newElement){if(index<0||index>=size){return;}int i=0;ListNode p=first;while(p!=null){if(i==index){p.data=newElement;break;}p=p.next;i++;}}//当前列表中是否含有target元素public  boolean contains(Object target){ListNode p=first;while(p!=null){if(p.data.equals(target)){return true;}p=p.next;}return false;}//返回指定索引处元素public Object at(int index){if(index<0||index>size){return;//啥也不干}int i=0;//指针指向的节点的索引ListNode p=first;while(p!=null){if(i==index){return p.data;break;}p=p.next;i++;}}public int indexOf(Object element){int i=0;//指针指向的节点的索引ListNode p=first;while(p!=null){if(p.data.equals(element)){return i;break;}p=p.next;i++;}return -1;}public String toString(){StringBuilder sb=new StringBuilder();ListNode p=first;while(p.next!=null){sb.append(p.data).append(",");p=p.next;}sb.append("]");return sb.toString();}}
//增和删链表更快

双向链表

first和last是亚元所代表的值为null<-    <-    <-
null->head->Node->Node->tail->null
a0     a1    a2    a3
双向链表结构public class ListNode{Object data;ListNode pre;ListNode next;public listNode(Object data){this.data=data;}
}public class DoubleLinkedList implements Mylist{private ListNode first=new ListNode(null);//头节点private ListNode last=new ListNode(null);//尾节点private size=0;public DoubleLinkList(){first.next=last;last.pre=first;}public void add(Object element){ListNode newNode=new ListNode(element);last.pre.next=newNode;newNode.next=last;newNode.pre=last.pre;last.pre=newNode;size++;}//新增一个元素//删除相同元素public  void delete(Object element){ListNode p=first.next;//first为nullwhile(p!=last){if(p.data.equals(element)){p.pre.next=p.next;p.next.pre=p.pre;p.next=null;p.pre=null;size--;break;}p=p.next;}}//根据索引删除元素public void delete(int index){if(index<0||index>size){return;//啥也不干}int i=0;ListNode p=first.next;//从first的下一个元素开始while(p!=last){if(i==index){p.pre.next=p.next;p.next.pre=p.pre;p.next=null;p.pre=null;size--;break;//注意这里}p=p.next;i++;}、}//将指定索引位置的·元素替换成新元素public void update(int index,Object newElement){if(index<0||index>=size){return;}int i=0;ListNode p=first.next;while(p!=last){if(i==index){p.data=newElement;break;}p=p.next;i++;}}//当前列表中是否含有target元素public  boolean contains(Object target){ListNode p=first.next;while(p!=last){if(p.data.equals(target)){return true;}p=p.next;}return false;}//返回指定索引处元素public Object at(int index){if(index<0||index>size){return;//啥也不干}int i=0;//指针指向的节点的索引ListNode p=first.next;while(p!=last){if(i==index){return p.data;break;}p=p.next;i++;}return null;}public int indexOf(Object element){int i=0;//指针指向的节点的索引ListNode p=first.next;while(p!=last){if(p.data.equals(element)){return i;break;}p=p.next;i++;}return -1;}public String toString(){StringBuilder sb=new StringBuilder();ListNode p=first.next;while(p!=last){sb.append(p.data);if(p.next!=last)sb.append(",");p=p.next;}sb.append("]");return sb.toString();}}

迭代器

public interface Iterator<E>{boolean hasNext();Object next();}public interface MyList extends Iterator{//新增一个元素void add(Object element);//删除相同元素void delete(Object element)//根据索引删除元素void delete(int index);//将指定索引位置的·元素替换成新元素void update(int index,Object newElement);//当前列表中是否含有target元素boolean contains(Object target);//返回指定索引处元素Object indexOf(int index);boolean hasNext();Object next();}public class DoubleLinkedList implements Mylist{private ListNode first=new ListNode(null);//头节点private ListNode last=new ListNode(null);//尾节点private size=0;public DoubleLinkList(){first.next=last;last.pre=first;}public void add(Object element){ListNode newNode=new ListNode(element);last.pre.next=newNode;newNode.next=last;newNode.pre=last.pre;last.pre=newNode;size++;}//新增一个元素//删除相同元素public  void delete(Object element){ListNode p=first.next;//first为nullwhile(p!=last){if(p.data.equals(element)){p.pre.next=p.next;p.next.pre=p.pre;p.next=null;p.pre=null;size--;break;}p=p.next;}}//根据索引删除元素public void delete(int index){if(index<0||index>size){return;//啥也不干}int i=0;ListNode p=first.next;//从first的下一个元素开始while(p!=last){if(i==index){p.pre.next=p.next;p.next.pre=p.pre;p.next=null;p.pre=null;size--;break;//注意这里}p=p.next;i++;}、}//将指定索引位置的·元素替换成新元素public void update(int index,Object newElement){if(index<0||index>=size){return;}int i=0;ListNode p=first.next;while(p!=last){if(i==index){p.data=newElement;break;}p=p.next;i++;}}//当前列表中是否含有target元素public  boolean contains(Object target){ListNode p=first.next;while(p!=last){if(p.data.equals(target)){return true;}p=p.next;}return false;}//返回指定索引处元素public Object at(int index){if(index<0||index>size){return;//啥也不干}int i=0;//指针指向的节点的索引ListNode p=first.next;while(p!=last){if(i==index){return p.data;break;}p=p.next;i++;}return null;}public int indexOf(Object element){int i=0;//指针指向的节点的索引ListNode p=first.next;while(p!=last){if(p.data.equals(element)){return i;break;}p=p.next;i++;}return -1;}public String toString(){StringBuilder sb=new StringBuilder();ListNode p=first.next;while(p!=last){sb.append(p.data);if(p.next!=last)sb.append(",");p=p.next;}sb.append("]");return sb.toString();}private ListNode now=first;public boolean hasNext(){return now.next!=last;;}public Object next(){ListNode next=now.next;now=now.next;return next.data;}}public iter(){while(list.hashNext()){String next=list.next();System.out.println(next);}
}//<T>泛型可以替换掉object

java List API

 

sort{set,List,Tree}collection|               |         |List           Set        Queue|     |        |
Stack ArrayList LinkedListList<String> list=new ArrayList<>();
list=new LinkedList<>();
list.add("asda");
list.remove("");Collection.sort(list);List<Student>list1=new ArrayList<>();
list1.add(new Student("zhangsan",10));
list1.add(new Student("isli",20));
Collection.sort(list1,(o1,o2)->{//camparetor排序器return o1.get()-o2.get();});for(int i=0;i<list1.size();i++){System.out.println(list1.get(i));
}//不能删东西,需要确保边界for(Student stu:list1){System.out.println(stu);
}Iterator<Student> iterator=new list1.Iterator();
//Iterator可以
while(iterator.hasNext()){System.out,println(iterator.next());
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/4077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓ComponentName简介及使用

目录 一、ComponentName是什么&#xff1f;二、类分析2.1 构造方法2.2 重点方法 三、ComponentName的使用 一、ComponentName是什么&#xff1f; ComponentName&#xff0c;顾名思义&#xff0c;就是组件名称&#xff0c;用于表示Android应用程序组件的名称。在Android开发中&…

航空企业数字化解决方案(207页PPT)

一、资料描述 航空企业数字化解决方案是一项针对航空公司在数字化转型过程中所面临挑战的全面应对策略&#xff0c;旨在通过先进的信息技术提升航空企业的运营效率、客户服务水平以及市场竞争力。这份207页的PPT详细介绍了航空企业数字化的各个方面&#xff0c;包括关键技术的…

Web3技术解析:区块链在去中心化应用中的角色

引言 在过去几年中&#xff0c;Web3技术已经成为了互联网领域的一个热门话题。作为区块链技术的延伸&#xff0c;Web3不仅仅是数字货币的代名词&#xff0c;更是一个能够为各种应用提供去中心化解决方案的强大工具。本文将深入探讨区块链在Web3去中心化应用中的关键角色&#…

ubuntu查看opencveigen

ubuntu查看opencv&eigen&cmake版本的方法 eigen eigen版本号在/usr/include/eigen3/Eigen/src/Core/util/Macros.h文件中&#xff0c;下图代表版本3.3.7 opencv版本 pkg-config --modversion opencv4也可能最后的字符串是opencv2&#xff0c;opencv

R语言 数据框的长、宽格式转换

Converting data between wide and long format 在宽、长格式之间转换数据 R语言中的大多数函数希望数据是长格式 但是&#xff0c;像 SPSS 通常使用宽格式数据 当你想把将数据从宽转换为长格式 常用的有两种方法&#xff1a; 1、gather() 和 spread() 来自 tidyr 包。 2、me…

W801学习笔记十二:掌机进阶V3版本之驱动(PSRAM/SD卡)

本次升级添加了两个模块&#xff0c;现在要把他们驱动起来。 一&#xff1a;PSRAM 使用SDK自带的驱动&#xff0c;我们只需要写一个初始化函数&#xff0c;并在其中添加一些自检代码。 void psram_heap_init(){wm_psram_config(0);//实际使用的psram管脚选择0或者1&#xff…

美团:搜索推荐算法工程师

目录 机器学习、深度学习和强化学习 迁移学习: 强化学习: 可解释性推荐:

中小学生如何开始创办谷歌?

现在财富自由这个词很火&#xff0c;因为每个人都想让自己能够摆脱朝九晚五工作的束缚。而通往财富自由的最佳路径——那就是创办自己的公司。 这不仅仅是关于金钱&#xff0c;更是关于掌控自己的未来&#xff0c;实现个人价值的最大化。 你是否曾梦想过自己的创意能够颠覆整…

Java学习路线及自我规划

荒废了一段时间&#xff0c;这段时间的总结开始了JavaWeb的学习但是困难重重&#xff0c;例如Maven&#xff0c;Vue的路由等&#xff0c;所以我反省了一段时间&#xff0c;因为基础薄弱&#xff0c;加之学习的资源是速成视频&#xff0c;导致大厦将倾的局面&#xff08;也算不上…

RabbitMQ工作模式(5) - 主题模式

概念 主题模式&#xff08;Topic Exchange&#xff09;是 RabbitMQ 中一种灵活且强大的消息传递模式&#xff0c;它允许生产者根据消息的特定属性将消息发送到一个交换机&#xff0c;并且消费者可以根据自己的需求来接收感兴趣的消息。主题交换机根据消息的路由键和绑定队列的路…

RabbitMQ的理论知识点,和使用RabbitMQ时常见的问题点【理论】!

不管使用任何语言调用RabbitMQ 一般都会存在各种问题&#xff0c;我整理了一下 我觉得会遇到的常见问题&#xff0c;并记录了 解决思路 。没有提供具体代码&#xff0c;后续有时间写个代码体会一下&#xff0c;实际有了解决思路&#xff0c;百度里有很多代码让我们使用。哈哈 …

盲人地图使用的革新体验:助力视障人士独立、安全出行

在我们日常生活中&#xff0c;地图导航已经成为不可或缺的出行工具。而对于盲人群体来说&#xff0c;盲人地图使用这一课题的重要性不言而喻&#xff0c;它不仅关乎他们的出行便利性&#xff0c;更是他们追求生活独立与品质的重要一环。 近年来&#xff0c;一款名为蝙蝠…

代码随想录算法训练营第三十八天| 动态规划,509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯

目录 动态规划 题目链接&#xff1a; 509. 斐波那契数 思路 代码 题目链接&#xff1a; 70. 爬楼梯 思路 代码 题目链接&#xff1a; 746. 使用最小花费爬楼梯 思路 代码 总结 动态规划 Dynamic programming&#xff0c;DP问题。某一问题包含很多重叠的子问题&#x…

echarts地图叠加百度地图底板实现数据可视化

这里写自定义目录标题 echarts地图叠加百度地图实现数据可视化echarts地图叠加百度地图实现数据可视化 实现数据可视化时,个别情况下需要在地图上实现数据的可视化,echarts加载geojson数据可以实现以地图形式展示数据,例如分层设色或者鼠标hover展示指标值,但如果要将echa…

React 之 组件模块依赖

导入&#xff08;Import&#xff09;和导出&#xff08;exporing&#xff09;组件 在一个文件中声明多个组件&#xff0c;但是文件变得太大的话就不方便查看了。要解决此问题&#xff0c;你可以将一个组件放到一个单独的文件中并&#xff08;导出&#xff09; export 组件&…

运筹系列91:vrp算法包PyVRP

1. 介绍 PyVRP使用HGS&#xff08;hybrid genetic search&#xff09;算法求解VRP类问题。在benchmark上的评测结果如下&#xff0c;看起来还不错&#xff1a; 2. 使用例子 2.1 CVRP COORDS [(456, 320), # location 0 - the depot(228, 0), # location 1(912, 0), …

C++进阶之路——关键字

C进阶——关键字 本系列博客主要对于已经有一定C/C基础的网友&#xff0c;欢迎志同道合的朋友来进行纯粹的技术交流&#xff01;&#xff01;&#xff01; 一、const 在C中&#xff0c;const 关键字是一个非常重要的特性&#xff0c;用于定义变量或对象的值为常量&#xff0c;…

通往AGI路上,DPU将如何构建生成式AI时代的坚实算力基石?

4月19日&#xff0c;在以“重构世界 奔赴未来”为主题的2024中国生成式AI大会上&#xff0c;中科驭数作为DPU新型算力基础设施代表&#xff0c;受邀出席了中国智算中心创新论坛&#xff0c;发表了题为《以网络为中心的AI算力底座构建之路》主题演讲&#xff0c;勾勒出在通往AGI…

Xcode 15构建问题

构建时出现的异常&#xff1a; 解决方式&#xff1a; 将ENABLE_USER_SCRIPT_SANDBOXING设为“no”即可&#xff01;

GateWay具体的使用!!!

一、全局Token过滤器 在Spring Cloud Gateway中&#xff0c;实现全局过滤器的目的是对所有进入系统的请求或响应进行统一处理&#xff0c;比如添加日志、鉴权等。下面是如何创建一个全局过滤器的基本步骤&#xff1a; 步骤1: 创建过滤器类 首先&#xff0c;你需要创建一个实现…