JAVA手写ArrayList以及LinkedList

手写记录一下~

 

顶级接口List

public interface List<E> {//返回线性表的大小public int getSize();//判断线性表中是否为空public boolean isEmpty();//判断线性表中是否包含元素oboolean contains(E o);//在线性表中查找元素o,若成功找到,返回其位置index;否则,返回-1public int indexOf(E e);//获取线性表中 位置为index的元素public E get(int index);//将线性表中 位置为index的元素设置为epublic void set(int index, E e);//在线性表中位置为index处添加元素epublic void add(int index, E e);//删除并返回线性表中位置为index的元素public E remove(int index);
}

ArrayList~~~

import java.util.Arrays;public class ArrayList<E> implements List<E> {private static final int DEFAULT_CAPACITY = 10;private E[] data;private int size;public ArrayList(int capacity) {this.size = 0;data = (E[]) new Object[capacity];}public ArrayList() {this(DEFAULT_CAPACITY);}// O(1)@Overridepublic int getSize() {return size;}// O(1)@Overridepublic boolean isEmpty() {return size == 0;}// O(n)@Overridepublic boolean contains(E o) {for (int i = 0; i < size; i++) {if (data[i].equals(o))return true;}return false;}// O(n)@Overridepublic int indexOf(E e) {for (int i = 0; i < size; i++) {if (data[i].equals(e))return i;}return -1;}// O(1)@Overridepublic E get(int index) {if (index < 0 || index >= size)throw new IllegalArgumentException("数组小标越界...");return data[index];}// O(1)@Overridepublic void set(int index, E e) {if (index < 0 || index >= size)throw new IllegalArgumentException("数组小标越界...");data[index] = e;}// O(n)@Overridepublic void add(int index, E e) {if (index < 0 || index > size) {throw new IllegalArgumentException("数组小标越界...");}if (size == data.length) {grow(2 * data.length);}for (int i = size - 1; i >= index; i--) {data[i + 1] = data[i];}data[index] = e;size++;}// 均摊时间复杂度 O(1)public void addLast(E e) {add(size, e);}// O(n)@Overridepublic E remove(int index) {if (index < 0 || index >= size) {throw new IllegalArgumentException("数组小标越界...");}E val = data[index];for (int i = index + 1; i < size; i++) {data[i - 1] = data[i];}size--;data[size] = null;if (size < (data.length >> 1)) {grow(data.length / 2);}return val;}private void grow(int newCapacity) {/** E[] newData = (E[]) new Object[newCapacity]; for(int i=0;* i<data.length; i++) newData[i] = data[i];* * data = newData;*/data = Arrays.copyOf(data, newCapacity);}public static void main(String[] args) {List<Integer> list = new ArrayList<>();for (int i = 0; i < 100; i++)list.add(i, i);for (int i = 0; i < 100; i++) {System.out.println("The " + i + "th element is: " + list.get(i));}for (int i = 0; i < 50; i += 8) {list.remove(i);}for (int i = 0; i < list.getSize(); i++) {System.out.println("After removing, the " + i + "th element is: " + list.get(i));}}

LinkedList~

public class LinkedList<E> implements List<E> {private class Node {private E data; //数据域private Node next; //指针域,指向下一个Nodepublic Node(E data, Node next) {this.data = data;this.next = next;}public Node(E data) {this(data, null);}public String toString() {return data.toString();}}private Node head;//private Node tail;private int size;public LinkedList() {head = null;size = 0;}//O(1)@Overridepublic int getSize() {return size;}//O(1)@Overridepublic boolean isEmpty() {return size == 0;}//O(n)@Overridepublic boolean contains(E o) {Node p = head;while(p != null) {if(p.data.equals(o))return true;p = p.next;}return false;}//O(n)@Overridepublic int indexOf(E e) {int result = -1;Node p = head;int i = 0;while(p != null) {if(p.data.equals(e)){result = i;break;}p = p.next;i++;}return result;}//O(n)@Overridepublic E get(int index) {if(index<0 || index >= size) {throw new IllegalArgumentException("非法下标...");}Node p = head;for(int i=0; i<index; i++)p = p.next;return p.data;}//O(n)@Overridepublic void set(int index, E e) {if(index<0 || index >= size) {throw new IllegalArgumentException("非法下标...");}Node p = head;for(int i=0; i<index; i++)p = p.next;p.data = e;		}//O(n)@Overridepublic void add(int index, E e) {if(index < 0 || index > size) {throw new IllegalArgumentException("下标越界.....");}//插到链表头部if(index == 0) {addFirst(e);}else if(index == size) {addLast(e);}else {Node prev = head;for(int i=0; i<index; i++) {prev = prev.next;}prev.next = new Node(e, prev.next);size++;}}//O(1)public void addFirst(E e) {Node node = new Node(e, head);head = node;size++;}//O(n)public void addLast(E e) {Node node = new Node(e, null);//链表为空if(head == null) {head = node;}else {Node prev = head;while(prev.next != null) {prev = prev.next;}prev.next = node;}size++;}//O(n)@Overridepublic E remove(int index) {if(index<0 || index >= size) {throw new IllegalArgumentException("非法下标...");}if(index == 0) {return removeFirst();}else if (index == size -1) {return removeLast();}else{Node prev = head;for(int i=0; i<index-1; i++)prev = prev.next;Node tmp = prev.next;prev.next = tmp.next;tmp.next = null;size--;return tmp.data;}}//O(1)public E removeFirst() {if(head == null)return null;E result = head.data;head = head.next;size--;return result;}//O(n)public E removeLast() {if(head == null)return null;E result;//链表只有一个节点if(head.next == null) {result = head.data;head = null;}else {Node prev = head;while(prev.next.next != null)prev = prev.next;result = prev.next.data;prev.next = null;}size--;return result;}public static void main(String[] args) {List<Integer> list = new LinkedList<>();for(int i=0; i<10; i++)list.add(i, i);for(int i=0; i<10; i++) {System.out.println("The " + i + "th element is: " + list.get(i));}list.remove(0);for(int i=0; i<list.getSize(); i++) {System.out.println("After removing, the " + i + "th element is: " + list.get(i));}}}

 

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

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

相关文章

[css] css中的url()要不要加引号?说说你的理解

[css] css中的url()要不要加引号&#xff1f;说说你的理解 可以加&#xff0c;也可以不加。这个跟html标签的属性书写可以加引号也可以不加引号是一样的道理&#xff0c;当然如果属性中含有特殊字符比如空格则需要加空格&#xff0c;否则会引起浏览器解析错误。如果想养成良好…

JDK源码学习路线~每天学一点~每天进步一点点

很多java开发的小伙伴都会阅读jdk源码&#xff0c;然而确不知道应该从哪读起。以下为小编整理的通常所需阅读的源码范围。 标题为包名&#xff0c;后面序号为优先级1-4&#xff0c;优先级递减 1、java.lang 1) Object 1 2) String 1 3) AbstractStringBuilder 1 4) StringBuff…

[css] 使用css写一个垂直翻转图片的效果

[css] 使用css写一个垂直翻转图片的效果 transform: rotateX(180deg); /* 垂直镜像翻转 */个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

20.pipe

pipe相当于angular1里面的filter 做一些格式转换啊&#xff0c;或者从一个数组里面选取一个元素等等 只要你愿意可以定义很复杂的内容‘’ 我们先看看 angular2 里面自带的一些pipe 我们去我们的week3 下的problem-list下 我们到html里面 之前是这样的 之后是这样的 我们再写三…

TCP/UDP相关知识

三次握手&#xff1a; 为了方便描述我们将主动发起请求的172.16.50.72:65076 主机称为客户端&#xff0c;将返回数据的主机172.16.17.94:8080称为服务器。 第一次握手: 建立连接。客户端发送连接请求&#xff0c;发送SYN报文&#xff0c;将seq设置为0。然后&#xff0c;…

[css] 请写出font属性的快捷写法

[css] 请写出font属性的快捷写法 p { font:italic bold 12px/20px arial,sans-serif; }个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

Redis内部数据结构-跳跃表

今天学习了跳跃表&#xff0c;记录一下下~ 一、跳跃表简介 跳跃表是一种随机化数据结构&#xff0c;基于并联的链表&#xff0c;其效率可以比拟平衡二叉树&#xff0c;查找、删除、插入等操作都可以在对数期望时间内完成&#xff0c;对比平衡树&#xff0c;跳跃表的实现要简…

[css] 举例说明与打印有关的属性有哪些?

[css] 举例说明与打印有关的属性有哪些&#xff1f; page page-break-before page-break-after page-break-inside个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题…

MYSQL索引结构学习笔记

mysql 的数据、索引、DDL 等数据&#xff0c;都是以文件形式存储的&#xff0c; 所以导致每次查询都是一次I/O操作&#xff0c;当I/O操作过大时&#xff0c;会严重影响效率 MYSQL索引结构: mysql使用的是B树来存储索引的&#xff0c;为什么不用其他的呢&#xff1f;二叉树 -&g…

[css] 如何让背景图片固定不随滚动条滚动

[css] 如何让背景图片固定不随滚动条滚动 background-attachment:fixed个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

SKYLINE UVALive - 4108

我一开始没有想到用线段树&#xff0c;是我学得太僵了... 我们要记录每段的最大高度&#xff0c;而且要组织成区间信息&#xff0c;这要用到线段树 怎么用呢&#xff1f; 线段树维护区间最大值&#xff1b;对于每个线段&#xff0c;先二分至其包含区间&#xff0c;如果最大值&g…

Mybatis源码学习笔记

Mybatis核心概念: Configuration : 管理 mysql-config.xml 全局配置关系类 SqlSessionFactory: Session 管理工厂接口 Session: SqlSession 是一个面向用户&#xff08;程序员&#xff09;的接口。SqlSession 中提供了很多操作数据库的方法 Executor : 执行器是一个接口…

[css] 你用过css的tab-size属性吗?浏览器默认显示tab为几个空格?

[css] 你用过css的tab-size属性吗&#xff1f;浏览器默认显示tab为几个空格&#xff1f; tab-size 属性规定制表符&#xff08;tab&#xff09;字符的空格长度。在 HTML 中&#xff0c;制表符&#xff08;tab&#xff09;字符通常显示为一个单一的空格字符个人简介 我是歌谣&…

JQData数据提取及MySQL简单操作——基于Python

JQData平台真的挺不错&#xff0c;平台数据可以免费使用一年&#xff0c;满足绝大多数人需求&#xff0c;具体账号获取请自行百度哟~ 因需要高频数据而Wind也只给近三年&#xff0c;再要还得购&#xff0c;&#xff0c;机缘遇到这一平台&#xff0c;获得了账号试用很不错&#…

数据库事物相关笔记

一、数据库的事物的基本特性 事物是区分文件存储系统与Nosql数据库重要特性之一&#xff0c;其存在的意义是为了保证即使在并发情况下也能正确的执行crud操作。怎样才算是正确的呢&#xff1f;这时提出了事物需要保证的四个特性即ACID&#xff1a; A: 原子性(atomicity) 事物…

[css] clear属性只对块级元素有效么?为何无法应用于行内元素?

[css] clear属性只对块级元素有效么&#xff1f;为何无法应用于行内元素&#xff1f; block元素浮动之后已经脱离了文档流了&#xff0c;排列的顺序都不一样了&#xff0c;所以清除了之后有效果。 inline-block还是在文档流里面&#xff0c;加浮动不加浮动都没有什么作用的&am…

GO语言-基础语法:条件判断

1. IF判断(aa.txt内容&#xff1a;asdfgh。bb.txt内容&#xff1a;12345) package mainimport ("io/ioutil""fmt" )func main() {const filename1, filename2 "aa.txt", "bb.txt"contents, err : ioutil.ReadFile(filename1) if err …

JVM模型学习笔记

JVM由三个主要的子系统构成 1. 运行时数据区&#xff08;内存结构&#xff09;: 运行时数据区也是JVM的核心部分 内存数据区又分&#xff1a;堆、java栈、本地方法栈、程序计数器、方法区 1.1 本地方法栈(线程私有)&#xff1a; 登记native方法&#xff0c;在Execution Eng…

[css] css的负边距有哪些应用场景?

[css] css的负边距有哪些应用场景&#xff1f; 垂直水平居中 通过伪元素扩大元素覆盖范围个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

tomcat 设置虚拟路径的4种方法

通常使用方法1或者方法2 方法1 &#xff08;添加配置文件&#xff09;&#xff1a;推荐使用&#xff0c;不需要重启服务器 在Tomcat根目录下的/conf/Catalina/localhost/ 路径下新建一个filename.xml&#xff0c;并在该xml中编写语句 即可创建虚拟站点&#xff0c;虚拟站点名为…