java基础 之 实现一个链表

news2024/9/27 6:19:30

文章目录

  • 引言
  • 链表
    • 节点
    • 单向链表
    • 双向链表
    • 链表的优缺点
  • java封装的链表
  • 自己实现一下链表
    • LinkNode节点类
    • LinkedList类实现
      • 示例图
      • 代码

引言

1、新建的节点需要两个值:value 和 节点 next;
2、新建的节点链表需要有一个head;
3、根据位置对链表进行添加、删除操作时需要注意判断位置;

链表

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据部分和指向下一个节点的引用
双向链表中还包括指向前一个节点的引用

节点

在这里插入图片描述

  • 单向节点有两个值:
    • value - 当前节点的值;
    • next - 下一个节点的地址
  • 双向节点有三个值:
    • pre - 前一个节点的地址
    • value - 当前节点的值
    • next - 下一个节点的地址

单向链表

在这里插入图片描述

双向链表

在这里插入图片描述

链表的优缺点

  • 优点

    1、不需要初始化容量,无需在创建时确定大小
    2、插入和删除的时间复杂度是O(1)
    3、如果发生内存回收时,无需大量移动对象,只需改变指针即可

  • 缺点:

    1、访问链表中的元素需要从头开始遍历,时间复杂度为O(n)。
    2、每个链表节点不仅需要存储数据,还需要存储指向前后节点的引用,因此相比数组,链表会占用更多的内存空间

java封装的链表

  • java内部封装了一个LinkedList类

    使用的是双向链表

  • LinkedList集合的一些方法
    LinkedList<String> linkedList = new LinkedList<>();
    
    • boolean add(Object element) 它将元素附加到列表的末尾。
      Boolean b1 = linkedList.add("hello");	//将"hello"添加到链表linkedList的尾部,即尾插法
      
    • boolean add(int index,Object element) 指定位置插入
      Boolean b2 = linkedList.add(3,"java");	//将"java"添加到链表linkedList的第3个位置,即中间插入法
      
    • void addFirst(E element) 元素附加到列表的头部
      Boolean b3 = linkedList.addFirst();	//将"world"添加到链表linkedList的头部,即头插法
      
    • void addLast(E element) 元素附加到列表的尾部
      linkedList.addLast("time");	//将"world"添加到链表linkedList的尾部,即尾插法
      
    • Object get(int index) 根据下标获取数据
      String s1 = linkedList.get(3) ;		//返回linkedList第三个位置的数据
      
    • Object getFirst() 它返回链表的第一个元素。
      String s2 = linkedList. getFirst();		//返回linkedList第一个位置的数据
      
    • Object getLast() 它返回链接列表的最后一个元素
      String s3 = linkedList.getLast() ;		//返回linkedList最后一个元素
      
    • boolean contains(Object element)如果元素存在于列表中,则返回true
      Boolean b4 = linkedList.contains("java");		//如果“java”在linkedList中返回true,不存在返回false
      
    • Object set(int index,Object element)它用于用新元素替换列表中的现有元素
      String s3 = linkedList.set(0,"China") ;		//用“china”替换linkedList第一个位置的数据
      
    • E remove() 删除第一个元素
      String s4 =linkedList.remove() ;		//删除linkedList第一个位置的数据
      
    • E remove(int location) 删除指定位置的元素
      String s5 =linkedList.remove(2) ;		//删除linkedList第2个位置的数据
      
    • E removeFirst() 删除并返回链接列表的头部一个元素
      String s6 =linkedList.removeFirst() ;		//删除并返回linkedList第一个位置的数据
      
    • E removeLast() 删除并返回链接列表的尾部一个元素
      String s7 =linkedList.removeLast()  ;		//返回linkedList第一个位置的数据
      
    • .clear():它删除列表中的所有元素。
      linkedList.clear();		//删除linkedList中的所有元素
      
    • .size() 返回链表长度
      linkedList.size() ;		//返回linkedList的长度
      

自己实现一下链表

以下实现是以单向链表为基准的实现

LinkNode、LinkedList类建议放在同一个包下

LinkNode节点类

public class LinkNode {
    int value;
    LinkNode next;
    // 创建一个节点
    public LinkNode(int value) {
        this.value = value;
    }
    @Override
    public String toString() {
        return "LinkedNode{" + "value=" + value + ", next=" + next + '}';
    }
}

LinkedList类实现

示例图

  • 头插法示例图
    • head为空
      在这里插入图片描述
    • head不为空
      在这里插入图片描述
  • 尾插法示例图
    • head为空:图同头插法
    • head不为空
      在这里插入图片描述
  • 中间插入示例图
    • 插入的位置是0,调用头插法
    • 插入的位置是链表的长度,调用尾插法
    • 0 < 插入的位置 < 链表的长度
      在这里插入图片描述
  • 删除某个节点示例图
    • 判断位置是否合法,根据链表的长度去判断即可,这里不多说了
    • 删除第一个
      在这里插入图片描述

      head = head.next;

    • 删除其他位置
      在这里插入图片描述

      pre = index.next;
      return

代码

public class LinkedList {
    public LinkNode head;

    // 获取链表的长度
    public int length(){
        int count = 0;
        LinkNode index = head;
        while (index!=null){
            index = index.next;
            count++;
        }
        return count;
    }
    // 头插法
    public void headInsert(int value){
        LinkNode node = new LinkNode(value);
        if(head==null){
            head = node;
            return;
        }
        node.next = head;
        head = node;
    }

    // 尾插法
    public void rearInsert(int value){
        LinkNode node = new LinkNode(value);
        LinkNode index = head;
        if(head==null){
            head=node;
            return;
        }
        while(index.next!=null){
            index = index.next;
        }
        index.next = node;
    }

    // 中间插入
    public void add(int position,int value){
        LinkNode node = new LinkNode(value);  // 插入的值的节点

        if(position==0){
            headInsert(value);
        }else if(position==length()){
            rearInsert(value);
        }else{
            LinkNode index = head;  // 遍历的节点
            LinkNode pre = null;  // 遍历节点的前一个节点
            int count = 0; // 用来记录遍历到哪个位置了
            while (index!=null){
                if(position==count){
                    pre.next = node;
                    node.next = index;
                }
                pre = index;  // 将当前的节点赋给pre
                index = index.next;  // 遍历节点往后走
                count++;  // 位置增加
            }
        }
    }

    // 删除
    public void delete(int position){
        // 判断位置是否合法
        if(position<0 || position>=length()){
            System.out.println("删除位置不合法");
        }
        // 首位置删除
        if(position==0){
            head = head.next;
        }else{
            int count = 0;
            LinkNode index = head; // 要遍历的链表的节点
            LinkNode pre = null;    // 用来记录的前一个节点
            while (index!=null){
                // 如果count正好是要删除的位置
                if(count==position){
                    pre.next = index.next;  // 删除成功,返回
                    return;
                }

                // count与要删除的位置不等
                pre = index;    // 记录前一个节点
                index = index.next;     // 记录当前节点
                count++;    // 数值增加
            }
        }

    }
    // 打印值
    @Override
    public String toString() {
        String s = "";
        while(head!=null){
            s+=head.value+" ";
            head = head.next;
        }
        return s;
    }
}

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

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

相关文章

The Open Group 2024生态系统架构·可持续发展年度大会全面解读

在全球数字化转型加速的时代背景下&#xff0c;人工智能技术正以前所未有的速度重塑各行各业的生态系统。尤其是随着ChatGPT、Sora等技术的爆发&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;技术在多个领域展现出超越人类的能力&#xff0c;AGI&#xff08;通用人…

Llama 3.2:利用开放、可定制的模型实现边缘人工智能和视觉革命

在我们发布 Llama 3.1 模型群后的两个月内&#xff0c;包括 405B - 第一个开放的前沿级人工智能模型在内&#xff0c;它们所产生的影响令我们兴奋不已。 虽然这些模型非常强大&#xff0c;但我们也认识到&#xff0c;使用它们进行构建需要大量的计算资源和专业知识。 我们也听到…

成都网安周暨CCS2024 | 大模型安全与产业应用创新研讨活动成功举办

9月11日-12日&#xff0c;作为2024年国家网络安全宣传周成都系列活动的重磅活动之一&#xff0c;CCS 2024成都网络安全系列活动在成都举行。“大模型安全与产业应用创新研讨活动”同期举办&#xff0c;本场活动由百度安全、成都无糖信息联合承办&#xff0c;特邀云安全联盟CSA大…

MYSQL求月份同比数据和环比数据

1.需求题目如下 1.首先求出每月每个account_id 对应的amount金额 2.利用表自关联&#xff0c;获取上月&#xff0c;上年对应月份及金额&#xff0c; 关联条件利用 主表月份-1个月上月月份 和 主表月份-1年上年月份 3.最后求同比和环比 附代码及测试数据 CREATE TABLE transa…

HTML·第3章 表格布局与表单交互

3.1 表格概述 3.1.1 表格的结构 表格是由行和列组成的二维表&#xff0c;而每行又由一个或多个单元格组成&#xff0c;用于放置数据或其他内容。表格中的单元格是行与列的交叉部分&#xff0c;是组成表格的最基本单元。单元格的内容是数据&#xff0c;也称数据单元格。数据单元…

如何在 macOS(MacBook Pro、Air 和 iMac)上恢复未保存的 Word 文档

Microsoft Word 在许多用户中很受欢迎&#xff0c;并且有多种用途。无论是为学校写论文、在办公室写报告还是其他许多事情。但是不保存文档并丢失数据可能是您可能面临的最可怕的噩梦。但是&#xff0c;也有几种方法可以在 macOS 上恢复未保存的 Word 文档。 用户在 Windows P…

【C++笔试强训】如何成为算法糕手Day5

学习编程就得循环渐进&#xff0c;扎实基础&#xff0c;勿在浮沙筑高台 循环渐进Forward-CSDN博客 目录 循环渐进Forward-CSDN博客 第一题&#xff1a;游游的you 思路&#xff1a; 第二题&#xff1a;腐烂的苹果 思路&#xff1a; 第三题&#xff1a;孩子们的游戏 思路&…

RabbitMQ下载安装运行环境搭建

RabbitMQ运行环境搭建 1、Erlang及RabbitMQ安装版本的选择2、下载安装Erlang2.1、下载Erlang2.2、安装Erlang2.2.1、安装Erlang前先安装Linux依赖库2.2.2、解压Erlang压缩包文件2.2.3、配置2.2.4、编译2.2.5、安装2.2.6、验证erlang是否安装成功 3、RabbitMQ下载安装3.1、下载3…

基于SSM+小程序的医院核酸检测服务管理系统(医院2)(源码+sql脚本+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM小程序的医院核酸检测服务管理系统实现了管理员、用户管理、普通管理员、医护人员。 1、管理员实现了首页、用户管理、医护人员管理、普通管理员、通知公告管理、疫苗接种管理、核…

2023_Spark_实验九:编写WordCount程序(Scala版)

需求&#xff1a; 1、做某个文件的词频统计//某个单词在这个文件出现次数 步骤&#xff1a; 文件单词规律&#xff08;空格分开&#xff09;单词切分单词的统计&#xff08;k,v&#xff09;->(k:单词&#xff0c;V&#xff1a;数量&#xff09;打印 框架&#xff1a; 单…

基于RPA+BERT的文档辅助“悦读”系统 | OPENAIGC开发者大赛高校组AI创作力奖

在第二届拯救者杯OPENAIGC开发者大赛中&#xff0c;涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到&#xff0c;我们特意开设了优秀作品报道专栏&#xff0c;旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者&#xff0c;希望能带给…

毕业设计选题:基于ssm+vue+uniapp的鲜花销售小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

uniapp EChars图表

1. uniapp EChars图表 &#xff08;1&#xff09;Apache ECharts 一个基于 JavaScript 的开源可视化图表库   https://echarts.apache.org/examples/zh/index.html &#xff08;1&#xff09;官网图例 &#xff08;2&#xff09;个人实现图例 1.1. 下载echart 1.1.1. 下…

新手教学系列——系统模块划分原则:如何让系统架构更加灵活与高效

在现代软件开发中,模块化设计是一个至关重要的概念。对于初学者来说,理解如何合理划分系统模块不仅能提高代码的可读性,还能让系统架构更具灵活性和可维护性。本文将深入探讨模块划分的基本原则,结合功能边界和数据边界的划分实例,帮助大家在实际开发中掌握模块化设计的精…

高校竞赛管理系统的设计与实现

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统高校竞赛管理系统信息管理难度大&#xff0c;容错率低&am…

828华为云征文 | 华为云Flexus云服务器X实例搭建Zabbix网络设备监视系统(Ubuntu服务器运维)

前言 Flexus X实例内嵌智能应用调优算法&#xff0c;性能强悍&#xff0c;基础模式GeekBench单核及多核跑分可达同规格独享型实例的1.6倍&#xff0c;性能模式更是超越多系列旗舰型云主机&#xff0c;为企业业务提供强劲动力。 &#x1f4bc; Flexus X Zabbix&#xff1a;打造…

Spring Boot 快速入门教程

1. Spring Boot 简介 Spring Boot 是一个基于 Spring 框架的项目&#xff0c;它简化了基于 Spring 的 Java 应用程序的创建和部署。Spring Boot 通过提供一系列的“Starters”来简化 Maven 配置&#xff0c;同时使用约定大于配置的原则&#xff0c;让开发者能够以最少的配置启…

计算机视觉硬件整理(四):相机与镜头参数介绍

文章目录 前言一、工业相机常用分类二、工业相机的基本参数三、工业相机的接口四、工业镜头的参数五、工业镜头的选择要点 前言 随着科技的飞速发展&#xff0c;工业自动化和智能制造在当今社会扮演着越来越重要的角色。在这个背景下&#xff0c;工业相机作为一种关键的视觉检…

C# 委托(Delegate)一

一.Delegate的定义说明&#xff1a; C# 中的委托&#xff08;Delegate&#xff09;就是类似于 C 或 C 中函数的指针。Delegate 是存有对某个方法引用的一种引用类型变量&#xff0c;引用可在运行时是可以被改变的&#xff0c;特别适用于实现事件和回调方法。所有的Delegate都是…

微服务MongoDB解析部署使用全流程

1、什么是MongoDB 1、非关系型数据库 NoSQL&#xff0c;泛指非关系型的数据库。随着互联网web2.0网站的兴起&#xff0c;传统的关系数据库在处理web2.0网站&#xff0c;特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心&#xff0c;出现了很多难以克服的问…