【Java 数据结构】LinkedList 类 和 模拟实现链表

 🔥博客主页🔥:【 坊钰_CSDN博客 】

欢迎各位点赞👍评论✍收藏⭐

目录

1. 什么是 LinkedList ?

2 LinkedList 的使用

2.1 LinkedList 的构造

 2.2 LinkedList 的常用方法

2.3 LinkedList 的遍历

3. 单链表的模拟实现

3.1 基本框架

3.2 头插

3.3 尾插

3.4 在第 pos 位后面插入 val

3.5 打印

3.6 求大小

4. 全部源码

5. 小结


1. 什么是 LinkedList ?

对于存储数据来说,ArrayList 是有缺陷的,ArrayList 动态扩容时可能会有空间的损失,而 LinkedList 的元素存储在特定的节点中,通过引用来联系元素之间的关系,效率较高

LinkedList 也是实现了 List 接口

  •  LinkedList 的底层是使用了双链表
  • LinkedList 适合多次频繁插入和删除的场景

2 LinkedList 的使用

2.1 LinkedList 的构造

LinkedList 有两种构造方法

LinkedList()                            //空构造方法
LinkedList(Collection<? extends E>)     //以链表进行构造(必须为 E 的子类)
public class Test {
    public static void main(String[] args) {
        // 空构造
        LinkedList list1 = new LinkedList();

        // 以链表来构造
        LinkedList list2 = new LinkedList(list1);
    }
    
}

 2.2 LinkedList 的常用方法

LinkedList 的常用方法 和 ArrayList的常用方法 基本一样,有兴趣可以看一下上一篇博客

【Java 数据结构】ArrayList 类 与 模拟实现顺序表-CSDN博客

2.3 LinkedList 的遍历

public class Test {
    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        // for-each 遍历
        for(Integer x : list)
            System.out.print(x);

        //使用迭代器遍历
        ListIterator<Integer> it = list.listIterator();
        while (it.hasNext()) {
            System.out.print(it.next() + " ");
        }
    }
}

3. 单链表的模拟实现

3.1 基本框架

public class MyLinkedList {

    public static class LinkedNode {
        int value;
        LinkedNode next;

        LinkedNode(int value) {
            this.value = value;
        }
    }
}

3.2 头插

/*
 * 头插
 * */

public void addInsert(int val) {
    LinkedNode node = new LinkedNode(val);
    if (head == null) {
        head = node;
    } else {
        node.next = head;
        head = node;
    }
}

3.3 尾插

/*
 * 尾插
 * */

public void fastInsert(int val) {
    LinkedNode node = new LinkedNode(val);
    if (head == null) {
        head = node;
    } else {
        LinkedNode ret = head;
        while (ret.next != null) {
            ret = ret.next;
        }
        ret.next = node;
    }
}

3.4 在第 pos 位后面插入 val

/*
 * 在第 pos 位后面插入 val
 * */

public void posInsert(int pos,int val) {
    LinkedNode node = new LinkedNode(val);
    if (pos <= 0 || pos > linkSize()) {
        System.out.println("Pos is No !");
        return;
    }
    if (pos == linkSize()) {
        fastInsert(val);
        return;
    }
    int count = pos - 1;
    LinkedNode ret = head;
    while (count != 0) {
        ret = ret.next;
        count--;
    }
    node.next = ret.next;
    ret.next = node;

}

3.5 打印

/*
 * 打印
 * */

public void printList() {
    LinkedNode ret = head;
    while (ret != null) {
        System.out.print(ret.value+" ");
        ret = ret.next;
    }
    System.out.println();
}

3.6 求大小

/*
 * 求大小
 * */

public int linkSize() {
    int count = 0;
    LinkedNode ret = head;
    while (ret != null) {
        count++;
        ret = ret.next;
    }
    return count;
}

4. 全部源码

public class MyLinkedList {

    public static class LinkedNode {
        int value;
        LinkedNode next;

        LinkedNode(int value) {
            this.value = value;
        }
    }

    LinkedNode head;

    /*
     * 打印
     * */
    public void printList() {
        LinkedNode ret = head;
        while (ret != null) {
            System.out.print(ret.value+" ");
            ret = ret.next;
        }
        System.out.println();
    }

    /*
     * 求大小
     * */
    public int linkSize() {
        int count = 0;
        LinkedNode ret = head;
        while (ret != null) {
            count++;
            ret = ret.next;
        }
        return count;
    }


    /*
     * 头插
     * */
    public void addInsert(int val) {
        LinkedNode node = new LinkedNode(val);
        if (head == null) {
            head = node;
        } else {
            node.next = head;
            head = node;
        }
    }

    /*
     * 尾插
     * */
    public void fastInsert(int val) {
        LinkedNode node = new LinkedNode(val);
        if (head == null) {
            head = node;
        } else {
            LinkedNode ret = head;
            while (ret.next != null) {
                ret = ret.next;
            }
            ret.next = node;
        }
    }

    /*
     * 在第 pos 位后面插入 val
     * */
    public void posInsert(int pos,int val) {
        LinkedNode node = new LinkedNode(val);
        if (pos <= 0 || pos > linkSize()) {
            System.out.println("Pos is No !");
            return;
        }
        if (pos == linkSize()) {
            fastInsert(val);
            return;
        }
        int count = pos - 1;
        LinkedNode ret = head;
        while (count != 0) {
            ret = ret.next;
            count--;
        }
        node.next = ret.next;
        ret.next = node;

    }
}

5. 小结

以上就是对 ArrayList 类 和 顺序表 的了解,具体还需宝子们去实践,如果觉得该博客对你有用的话,希望一键三连,点个关注不迷路,谢谢支持  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

修改vue-element-admin,如何连接我们的后端

改哪几个文件就可以连接我们后端 ​​​​​​​ 主要就这四个 main.js&#xff0c;屏蔽这个或者删除 vue-config 最后两个文件改下端口即可 这样基本就能发了&#xff0c;但是还要改下 改成api 然后还要修改request.js 这里改成我们返回的状态码 我讲一个东西很容易就懂了&…

为什么在Cloudflare域名绑定添加DNS后,域名+端口无法访问?(Cloudflare域名+端口无法访问的问题详解)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Cloudflare 域名+端口无法访问 📒📝 问题示例📝 出现原因分析🔍 1. Cloudflare 的代理工作原理🔍 2. 问题核心📝 解决方案🎯 方法 1🎯 方法 2🎯 方法 3🎯 方法 4(推荐)🔖 配置示例⚓️ 相关链接 ⚓️�…

VS2022 中的 /MT /MTd /MD /MDd 选项

我们有时编译时,需要配置这个 运行库,指定C/C++运行时库的链接方式。 如下图 那么这些选项的含义是什么? /MT:静态链接多线程库 /MT选项代表“Multi-threaded Static”,即多线程静态库。选择此选项时,编译器会从运行时库中选择多线程静态连接库来解释程序中的代码,…

【NODE】01-fs和path常用知识点

前言 最近在使用express-generator知识进行搭建前后端通信&#xff0c;其中有些知识点涉及到nodejs的fs和path核心模块&#xff0c;因此另写一篇文章进行介绍和代码案例练习。 fs&#xff08;文件系统&#xff09;和 path 是 Node.js 的核心模块&#xff0c;用于文件操作和路径…

c++编译过程初识

编译过程 预处理&#xff1a;主要是执行一些预处理指令&#xff0c;主要是#开头的代码&#xff0c;如#include 的头文件、#define 定义的宏常量、#ifdef #ifndef #endif等条件编译的代码&#xff0c;具体包括查找头文件、进行宏替换、根据条件编译等操作。 g -E example.cpp -…

碰一碰发视频后端源码技术开发详解,支持OEM

一、引言 碰一碰发视频作为一种新颖的交互方式&#xff0c;在前端为用户带来便捷体验的同时&#xff0c;后端技术起着至关重要的支撑作用。后端负责管理视频资源、处理 NFC 标签信息与视频的关联逻辑、用户数据的存储与分析以及与前端的高效通信&#xff0c;确保整个系统稳定、…

HarmonyOS NEXT 实战之元服务:静态案例效果---本地特色景色

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; import { authentication } …

面试场景题系列:设计一致性哈希系统

为了实现横向扩展&#xff0c;在服务器之间高效和均匀地分配请求/数据是很重要的。一致性哈希是为了达成这个目标而被广泛使用的技术。首先&#xff0c;我们看一下什么是重新哈希问题。 1 重新哈希的问题 如果你有n个缓存服务器&#xff0c;常见的平衡负载的方法是使用如下哈希…

SqlSugar配置连接达梦数据库集群

安装达梦数据库时&#xff0c;会自动在当前操作系统中创建dm_svc.conf文件&#xff0c;可以在其中配置集群信息&#xff0c;不同操作系统下的文件位置如下图所示&#xff1a;   dm_svc.conf文件内的数据分为全局配置区域、服务配置区域&#xff0c;以参考文献1中的示例说明&…

scss配置全局变量报错[sass] Can‘t find stylesheet to import.

路径没有错误&#xff0c;使用别名即可 后又提示Deprecation Warning: Sass import rules are deprecated and will be removed in Dart Sass 3.0.0. 将import改为use 使用时在$前添加全局变量所在文件&#xff0c;即variable.

UGUI源码分析 --- UI的更新入口

首先所有的UI组件都是添加到画布&#xff08;Canvas&#xff09;显示的&#xff0c;所以首先要从Canvas入手&#xff0c;通过搜索脚本函数以及使用Profiler查看UI的函数的执行&#xff0c;定位到了willRenderCanvases函数 打开UI的文件夹&#xff0c; 通过搜索willRenderCanvas…

音视频入门知识(二)、图像篇

⭐二、图像篇 视频基本要素&#xff1a;宽、高、帧率、编码方式、码率、分辨率 ​ 其中码率的计算&#xff1a;码率(kbps)&#xff1d;文件大小(KB)&#xff0a;8&#xff0f;时间(秒)&#xff0c;即码率和视频文件大小成正比 YUV和RGB可相互转换 ★YUV&#xff08;原始数据&am…

电脑配置maven-3.6.1版本

不要使用太高的版本。 apache-maven-3.6.1-bin.zip 下载这个的maven压缩包 使用3.6.1版本。 解压缩放在本地软甲目录下面&#xff1a; 配置系统环境变量 在系统环境下面配置MAVEN_HOME 点击path 新增一条 在cmd中输入 mvn -v 检查maven的版本 配置阿里云镜像和本地的仓库 …

Python基础语法知识——数据类型的查询、数据类型转化

今天第一次学习python&#xff0c;之前学习过C&#xff0c;感觉学习起来还可以&#xff0c;就是刚用的时候有点手残&#xff0c;想的是python代码&#xff0c;结果写出来就是C,本人决定每天抽出时间写点。同时继续更新NX二次开发专栏学习&#xff0c;话不多说&#xff0c;晚上的…

Boost之log日志使用

不讲理论&#xff0c;直接上在程序中可用代码&#xff1a; 一、引入Boost模块 开发环境&#xff1a;Visual Studio 2017 Boost库版本&#xff1a;1.68.0 安装方式&#xff1a;Nuget 安装命令&#xff1a; #只安装下面几个即可 Install-package boost -version 1.68.0 Install…

C语言初阶习题【17】求N的阶乘( 递归和非递归实现)

1.题目 2.分析 非递归 需要用到循环&#xff0c;n个数就是循环n次&#xff0c;每次和之前的乘起来 例如 5的阶乘 就是 5*4 *3 *2 *1 循环1到5 。需要一个变量来接收每次的结果 注意这个地方是乘&#xff0c;所以要从1 开始&#xff0c;sum 也需要是1而不是0 for(i 1&#xf…

云效流水线自动化部署web静态网站

云效流水线部署静态网站 背景新建流水线配置流水线运行流水线总结 背景 配置流水线以前&#xff0c;每次更新导航网站都要登进去宝塔后台&#xff0c;删掉旧的目录和文件&#xff0c;再上传最新的文件&#xff0c;太麻烦啦 网上的博客基本都是分享vue项目&#xff0c;这一篇是…

【开源项目】数字孪生化工厂—开源工程及源码

飞渡科技数字孪生化工厂管理平台&#xff0c;基于自研孪生引擎&#xff0c;将物联网IOT、人工智能、大数据、云计算等技术应用于化工厂&#xff0c;为化工厂提供实时数据分析、工艺优化、设备运维等功能&#xff0c;助力提高生产效率以及提供安全保障。 通过可视化点位标注各厂…

SpringCloud整合skywalking实现链路追踪和日志采集

1.部署skywalking https://blog.csdn.net/qq_40942490/article/details/144701194 2.添加依赖 <!-- 日志采集 --><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version&g…

Linux下Nvidia显卡GPU开启驱动持久化

GPU开启驱动持久化的原因 GPU 驱动一直处于加载状态&#xff0c; 减少运行程序时驱动加载的延迟。不开启该模式时&#xff0c;在程序每次调用完 GPU 后&#xff0c; GPU 驱动都会被卸载&#xff0c;下次调用时再重新加载&#xff0c; 驱动频繁卸载加载&#xff0c; GPU 频繁被…