数据结构和算法(二)

2023-11-10

ArrayList 和LinkedList原理,代码实现,性能区别.

1,ArrayList 为什么查询快

数组和集合区别:动态大小,数组的长度是固定的,

ArrayList : 数组集合,内部使用数组实现的。

自定义ArrayList: 如下:

public static void main(String[] args) throws Exception {
        MyArrayList myArrayList = new MyArrayList();
        //添加
        myArrayList.add(1);
        myArrayList.add(2);
        myArrayList.add(3);
        myArrayList.add(4);
        myArrayList.add(5);
        myArrayList.add(6);
        myArrayList.add(7);
        myArrayList.add(8);
        myArrayList.add(9);
        //修改
        myArrayList.set(1,70);

        //删除
        myArrayList.removeAt(1);
        System.out.println(myArrayList.size);
//        myArrayList.clear();
        for (int i=0;i<myArrayList.size;i++){
            System.out.print(myArrayList.get(i) + ",");
        }

    }

    //定义一个数组
    private Object[] objects = new Object[4];

    private int size = 0; //集合大小

    public int size(){
        return size;
    }

    //添加
    public void add(Object value){
        //判断是否可以放的下
        if(size >= objects.length){
            //动态扩容
            Object[] temp = new Object[objects.length * 2];
//            Arrays.copyOf(objects, objects.length * 2);
            for (int i = 0;i< objects.length;i++){
                temp[i] = objects[i];
            }
            objects = temp;
        }
        objects[size] = value;
        size++;
    }

    //修改
    public void set(int index,Object value) throws Exception{
        //验证
        if(index >= size || index < 0){
          throw new Exception("超出范围");
        }
        objects[index] = value;
    }

    //获取
    public Object get(int index) throws Exception{
        //验证
        if(index >= size || index < 0){
            throw new Exception("超出范围");
        }
        return objects[index];
    }

    //清空
    public void clear(){
        size = 0;
        objects = new Object[4];
    }

    public void removeAt(int index) throws Exception{
        //验证
        if(index >= size || index < 0){
            throw new Exception("超出范围");
        }

        for (int i = index+1; i<size; i++){
            objects[i-1] = objects[i];
        }
        size--;
    }

LinkList : 底层使用链表实现 为什么查询慢..

自定义LinkedList 如下:

链表实现:包含node节点类

public static void main(String[] args) throws Exception {
        MyLinkedList myLinkedList = new MyLinkedList();
        //添加
        myLinkedList.add(1);
        myLinkedList.add(2);
        myLinkedList.add(3);
        myLinkedList.add(4);
        myLinkedList.add(5);
        myLinkedList.add(6);
        myLinkedList.add(7);
        myLinkedList.add(8);
        myLinkedList.add(9);
        //修改
        myLinkedList.set(1,70);
        //获取
        System.out.println(myLinkedList.get(8));
        //删除
        myLinkedList.removeAt(1);
        System.out.println(myLinkedList.size);
//        myLinkedList.clear();
        for (int i=0;i<myLinkedList.size;i++){
            System.out.print(myLinkedList.get(i) + ",");
        }

    }
    private int size = 0;
    private Node head = null; //头 , 链表有头什么都有, 没头什么都没有.
    public int size(){
        return size;
    }
    //添加
    public void add(Object value){
        Node newNode  = new Node(value);
        if(head == null){ //第一次添加
            head = newNode;
        }else {
            //指针
            Node temp = head; //当前节点
            while (temp.getNext() != null){
                temp = temp.getNext(); //当前节点向后移动
            }
            //循环结束, temp表示最后一个节点
            temp.setNext(newNode);
        }
        size++;
    }

    //修改
    public void set(int index,Object value){
        Node temp = head;
        for (int i = 0;i<index;i++){
            temp = temp.getNext();
        }
        //temp 定位到指定位置
        temp.setValue(value);
    }

    //获取
    public Object get(int index){
        Node temp = head;
        for (int i = 0;i<index;i++){
            temp = temp.getNext();
        }
        //temp 定位到指定位置
       return temp.getValue();
    }

    //清除
    public void clear(){
        head = null;
        size = 0;
    }

    public void removeAt(int index){
        //删除头
        if(index == 0){
            head = head.getNext();
        }else {
            //找到删除元素的前一个元素
            Node temp = head;
            for (int i=0;i<index-1;i++){
                temp = temp.getNext();
            }
            //循环结束, temp表示删除元素的前一个元素
            temp.setNext(temp.getNext().getNext());
        }
        size--;
    }
public class Node {
    private Object value; //数据
    // 下一个节点地址(对象引用)
    private Node next;

    //构造方法
    public Node(Object value) {
        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;
    }
}

线性结构的列表:

  1. 单链表: 像马路单行线 

  2. 单向循环链表: 像马路的单行圆盘路 

  3. 双链表: 像马路的双行线

  4. 双向循环链表:像马路的双行圆盘路 

LinkedList:使用的是双向循环链表实现。

ArrayList 和 LinkedList 对比:

  1. 添加: ArrayList 使用数组的方式添加, 向对应的位置放, 如何不扩容的话性能很高, 如果需要扩容的话就不太好了, 

  2. 删除:ArrayList删除 , 删除非最后一个元素,需要维护数组索引, 性能不太好了。LinkedList删除中间元素效率也是不高的,删除前面和后面的数据效率高。

  3. 获取和修改:ArratList通过数组索引直接定位到元素, 而LinkedList 则需要从链表头开始一直循环找到需要的元素,则性能很好。

栈和队列的代码实现

栈:先进后出,数组实现的栈(固定栈),链表实现的栈(动态大小)

如何使用数组和单链表实现栈 push() pop() 俩个函数。

队列:先进先出,

如何使用链表实现队列 enqueue() dequeue() 俩个函数。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构和算法(二) 的相关文章

  • 数据结构算法

    线性表 从顺序表中删除具有最小值的元素 xff08 假设唯一 xff09 并由函数返回被删元素的值 空出的位置由最后一个元素填补 xff0c 若顺序表为空则显示出错信息并退出运行 算法思想 xff1a 搜索整个顺序表 xff0c 查找最小值
  • 动态规划系列之「最长递增子序列的个数」

    673 最长递增子序列的个数 给定一个未排序的整数数组 找到最长递增子序列的个数 示例 1 输入 1 3 5 4 7 输出 2 解释 有两个最长递增子序列 分别是 1 3 4 7 和 1 3 5 7 示例 2 输入 2 2 2 2 2 输出
  • 数据结构 —七大排序算法(图文详细版)

    文章目录 前言 一 插入排序 1 直接插入排序 1 原理 2 实现 3 稳定性 时间复杂度 2 希尔排序 1 原理 2 具体实现 3 稳定性 时间复杂度 二 选择排序 1 直接选择排序 1 原理 2 具体实现 3 稳定性 时间复杂度 4 优
  • 有限状态自动机

    1 什么是有限状态自动机 1 1什么是计算 维基百科定义 计算 英语 Calculation 是一种将 单一或多个的输入值 转换为 单一或多个的结果 的一种思考过程 可以简单理解为给出一个问题得到一个答案的过程 如下图所示日常生活比较常见计
  • 数据结构与算法:遍历二叉树

    二叉树遍历原理 二叉树的遍历 traversing binary tree 是指从根结点出发 按照某种次序依次访问二叉树中所有结点 使得每个结点被访问一次且仅被访问一次 这里有两个关键词 访问和次序 二叉树遍历方法 二叉树的遍历方式可以很多
  • JavaScript 算法系列---动态规划

    很久之前接触过这样一道题目 总共有十层阶梯 从1层开始往上爬 每次可以上1层或者2层 问到10层总共有多少种方法 思路 这个问题就是动态规划的一个经典例子 所谓动态规划 就是把复杂的问题进行拆解 拆解成一个个子问题 而这类问题最后非常适合使
  • 单链表实现(C++)

    C 实现单链表数据结构 myList h ifndef MYLIST H define MYLIST H typedef struct node int data struct node next Node class myList pub
  • 最短路径(Dijkstra)算法

    目录 一 Dijkstra算法 二 核心思路 三 步骤 四 代码 一 Dijkstra算法 迪杰斯特拉 Dijkstra 算法是由荷兰计算机科学家狄克斯特拉于1959年提出的 是寻找从一个顶点到其余各顶点的最短路径算法 可用来解决最短路径问
  • 【STL详解】stack

    文章目录 前言 一 STL 二 stack 1 stack的创建 2 stack相关方法 3 如何对satck进行排序 前言 本篇文章将总结SLT stack 以及其常用方法 一 STL STL 是 Standard Template Li
  • 数据结构-二分搜索树转双向链表(Java)

    二分搜索树转双向链表 牛客JZ36 题目 思路 1 对二分搜索树进行中序遍历 2 将二分搜索树左节点和根节点相连接 右节点和根节点相连接 遍历左子树 连接 左子树尾部不为空 leftTail right pRootOfTree pRootO
  • 环形链表II

    环形链表II 给定一个链表的头节点 head 返回链表开始入环的第一个节点 如果链表无环 则返回 null 如果链表中有某个节点 可以通过连续跟踪 next 指针再次到达 则链表中存在环 为了表示给定链表中的环 评测系统内部使用整数 pos
  • 数据结构与算法:线索二叉树

    线索二叉树 线索二叉树原理 首先我们要来看看这空指针有多少个呢 对于一个有n个结点的二叉链表 每个结点有指向左右孩子的两个指针域 所以一共是2n个指针域 而n个结点的二叉树一共有n 1条分支线数 也就是说 其实是存在2n n 1 n 1个空
  • 【EMC笔试题】N个整数中找出三个数,使其和的绝对值最小

    题目描述 给定包含N个数的无序数组S 可能包含负数 0 正数 求三个数A B C 使其和的绝对值最小 例如 S 9 0 1 3 6 A 9 B 3 C 6 MIN 0 算法解析 解法一 枚举3个数 O N N N 解法二 对S排序后枚举其中
  • 二叉树-判断另一棵树的子树(Java)

    另一棵的子树 力扣572题 题目 给你两棵二叉树 root 和 subRoot 检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树 如果存在 返回 true 否则 返回 false 二叉树 tree 的一棵子树包括 t
  • 二分查找(Binary Search) 常见问题解决方法总结

    缘由 今天浏览 何登成的技术博客 无意中发现了写的blog 二分查找 Binary Search 需要注意的问题 以及在数据库内核中的实现 随想总结下二分查找的常见问题 问题背景 今年的实习生招聘考试 我出了一道二分查找 Binary Se
  • 【算法】分治、动态规划和贪心算法

    这三种算法非常相似 但是又有一些区别 理解如下 分治 把一个问题划分为若干子问题 求出子问题的最优解 再把子问题的最优解进行merge 最终得到原问题的最优解 动态规划 原问题的最优解包含子问题的最优解 即 拥有最优子结构 同时 求子问题的
  • 七大经典排序算法总结【详解】

    排序算法的分类 插入排序 选择排序 交换排序 归并排序 具体分类如图所示 这七种排序算法在我们生活中应用非常广泛 所用的场景各有不同 他的时间复杂度和空间复杂度也是不同的 一 插入排序 初始数据越接近有序 时间效率越高 1 直接插入排序 直
  • 数据结构与算法:KMP模式匹配算

    KMP模式匹配算法原理 如果主串S abcdefgab 其实还可以更长一些 我们就省略掉只保留前9位 我们要匹配的T abcdex 那么如果用BF算法的话 前5个字母 两个串完全相等 直到第6个字母 f 与 x 不等 如图5 7 1的 所示
  • 排列数组使得偶数在奇数的前面

    Name ReorderOddEven c Author 齐保元 Version Copyright Your copyright notice Description Hello World in C Ansi style include
  • LSM详解

    关于LSM结构的相关介绍 这篇文章比较好 特此纪录一下https yq aliyun com articles 767772

随机推荐

  • Eigen:C++中Eigen库的安装与学习

    1 下载地址 http eigen tuxfamily org index php title Main Page 进入上边官方网站进行下载如下所示 找到自己需要的版本下载即可 我下载的是3 3 8 右边的zip 2 解压配置即可 找到你下
  • Kafka配置与使用

    Kafka依赖于zookeeper 因此先配置zookeeeper zookeeper配置 修改 opt bigdata zookeeper conf zoo cfg dataDir data zookeeper 配置zookeeper数据
  • Java实现通过证书访问Https请求

    创建证书管理器类 import java io FileInputStream import java security KeyStore import java security cert CertificateException imp
  • 记录-常见算法的收集

    1 快速排序 找到基准点的位置 既不浪费空间又可以快一点的排序算法 如 6 1 2 7 9 3 4 5 10 8 这10个数进行排序 首先找到一个数作为基准点 一个参照数 为了方便 让第一个数6作为基准点 然后将这个序列中所有比基准数大的数
  • JQ工具2

    JQ工具2 开发工具与关键技术 VS JQ 作者 唐文坚 撰写时间 2020 10 17 jQuery extend deep target object1 objectN 概述 用一个或多个其他对象来扩展一个对象 返回被扩展的对象 如果不
  • C语言经典100例题(47)--宏#define命令练习(2)

    目录 题目 问题分析 代码 运行结果 题目 宏 define命令练习 2 问题分析 如果我们在 define的宏定义的内容过长时 我们的编译器中一行放不下 我们还可以加入续行符 也就是 来进行换行 是否一定需要使用换行符呢 答案是肯定的 如
  • 数组中最大最小值(C语言实现)

    题目描述 从键盘输入n n从键盘输入 n lt 100 个数存放在数组中 输出其中的最大数和最小数及他们对应的下标 输入说明 输入包含2行 第一行只有1个数字表示n 第二行有连续n个数字 其间用半角空格间隔 输出说明 输出只有1行 顺次输出
  • 快速排序及sort的理解

    快速排序 快速排序的思想 1 在数据集中 选择一个元素作为 基准 2 所有小于 基准 的元素都移动到 基准 左边 所有大于 基准 的元素都移动到 基准 右边 3 对 基准 左右两边的子集 递归地重复 1 和 2 直到所有子集的长度都只有1个
  • 按位非‘~’符号的使用

    所谓的按位非就是在数字前加上 的符号 最简单的记忆方法是 a a 1 let a 1 let b a b 2 let a 2 let b a b 3 let a 1 let b a b 0 使用场景 在if判断的时候 if在0的情况下的转换
  • C3-Squid-access.log

    C3 Squid access log 拓扑 DNS 10 0 100 71 Haproxy 10 0 100 82 Squid 10 0 100 72 73 Nginx 10 0 100 75 76 NFS 10 0 100 70 DNS
  • ASP.NET 中得到网站绝对路径的几种方法

    在编写 ASP NET 应用程序的时候 有时为了更好地进行控制静态文件的路径 如在模板页或者用户控件中设置js或者css文件的路径等 采用绝对路径是难免的 下面就是几种获取绝对路径的几种方法 C 代码 VirtualPathUtility
  • SVN学习笔记 .

    转载自 http blog csdn net tengbaichuan article details 10632349 参考文档 官方文档 http www subversion org cn svnbook 包括可下载的PDF 和一页H
  • 浅谈npm、yarn、cnpm、pnpm(内附网址链接)

    1 npm 1 1 npm简介 npm由三个独立的部分组成 网站 网站是开发者查找包 package 设置参数以及管理npm使用体验的主要途径 注册表 registry 注册表是一个巨大的数据库 保存了每个包 package 的信息 命令行
  • Ubuntu 16.04 取消 conda 自动启动工作空间 base

    问题描述 Ubuntu 16 04 安装conda 之后它会自动启动工作空间base base的默认 Python 版本是 3 7 而Ubuntu 16 04 的默认 Python 版本是2 7 解决方案 如果不想默认启动 base工作空间
  • gcc g++ 学习

    一 编译的时候 此时main cpp头文件是 include Person h g main cpp Person Person cpp o main I Person 解析 Person Person cpp 链接main cpp的上一层
  • 工厂模式--Factory Method with Go

    Factory Method 工厂设计模式允许创建对象 而无需指定将要创建的对象的确切类型 Implementation 举个栗子 用个例子展示怎么把数据存储在不同的后端 比如 内存 磁盘 Types type 一个Store interf
  • PAT C入门题目-竖着输出字符串(Z:c语言求数组长度 sizeof()&strlen())

    7 2 I Love GPLT 5 分 这道超级简单的题目没有任何输入 你只需要把这句很重要的话 I Love GPLT 竖着输出就可以了 即每个字符占一行 包括空格 即每行只能有1个字符和回车 include
  • sketch基础教程大全,对象、图层、画板常见技巧

    sketch对象 图层 画板的使用技巧 1 通过快捷键调整图形的形状 选择图形 按住Command按键 然后通过上 下 左 右方向键按1像素调整图形形状 同时按住按钮 CommandShift方向键 可调整方向键 2 复制元素 选择一个元素
  • Python爬虫从入门到精通:(24)scrapy框架01_scrapy框架的认识、安装_Python涛哥

    scrapy框架的认识 安装 框架简介 什么是框架 所谓的框架其实就是一个被集成了很多功能且具有很强通用性的一个项目模板 怎么学习 学习的是框架中集成好的各种功能的特性是作用 进阶学习 逐步的探索框架的底层 安装scrapy 是一个专门用于
  • 数据结构和算法(二)

    ArrayList 和LinkedList原理 代码实现 性能区别 1 ArrayList 为什么查询快 数组和集合区别 动态大小 数组的长度是固定的 ArrayList 数组集合 内部使用数组实现的 自定义ArrayList 如下 pub