探究Java中的链表

news2024/11/18 8:49:24

引言:

        在Java编程中,链表是一种常见的数据结构,具有灵活的内存管理和动态的元素插入与删除能力。本篇博客将深入探讨链表的结构和概念,比较链表与顺序表的区别,介绍Java中LinkedList的常用函数并通过示例说明LinkedList的使用。

一、链表的结构和概念

        链表是一种线性表数据结构,由节点组成,每个节点包含数据元素和指向下一个节点的指针。链表中的节点顺序存储,通过节点之间的指针来建立关联。

        常见的链表包括单向链表、双向链表和循环链表,它们在指针的连接方式以及节点的遍历方式上略有不同,当然,使用最多的还是双向链表。单向链表懂了双向链表自然就会了。 

二、链表与顺序表的区别

1.存储方式:

链表:链表中的元素按照节点相连的方式来存储,每个节点包含数据和指向下一个节点的指针。由于节点在内存中可以是分散的,所以可以动态添加和删除元素。

顺序表:顺序表中的元素按照在内存中的顺序依次存储,可以使用数组或固定大小的内存块实现。元素在内存中的位置是连续的,通过索引可以直接访问元素。

2.插入和删除操作:

链表:由于链表的节点是相互连接的,可以在任意位置插入和删除元素,只需要调整指针的指向即可。插入和删除的时间复杂度为O(1)。

顺序表:在顺序表中,插入和删除操作可能需要移动其他元素来腾出空间或填补空缺,所以时间复杂度通常为O(n),其中n是元素的数量。

3.随机访问:

链表:链表中的元素只能通过遍历链表来访问,需要从头节点开始逐个遍历,直到找到目标节点。时间复杂度为O(n),其中n是目标节点的位置。

顺序表:由于顺序表的元素在内存中是连续存储的,可以通过索引直接访问任意位置的元素,时间复杂度为O(1)。

三、LinkedList的常用函数

  1. add(E e):在链表的末尾添加元素。

    LinkedList<String> list = new LinkedList<>();
    list.add("apple");
    
  2. addFirst(E e):在链表的头部添加元素。

    LinkedList<String> list = new LinkedList<>();
    list.addFirst("apple");
    
  3. addLast(E e):在链表的末尾添加元素,等同于add(E e)。

    LinkedList<String> list = new LinkedList<>();
    list.addLast("apple");
    
  4. remove():移除并返回链表的第一个元素。

    LinkedList<String> list = new LinkedList<>();
    list.add("apple");
    String removed = list.remove();
    
  5. removeFirst():移除并返回链表的第一个元素,等同于remove()。

    LinkedList<String> list = new LinkedList<>();
    list.add("apple");
    String removed = list.removeFirst();
    
  6. removeLast():移除并返回链表的最后一个元素。

    LinkedList<String> list = new LinkedList<>();
    list.add("apple");
    String removed = list.removeLast();
    
  7. get(int index):获取指定位置的元素。

    LinkedList<String> list = new LinkedList<>();
    list.add("apple");
    String element = list.get(0);
    
  8. size():返回链表中元素的数量。

    LinkedList<String> list = new LinkedList<>();
    list.add("apple");
    int size = list.size();

 

四、LinkedList的使用

下面通过示例来说明LinkedList的使用:

import java.util.LinkedList;

public class LinkedListExample {
    public static void main(String[] args) {
        // 创建一个LinkedList对象
        LinkedList<String> linkedList = new LinkedList<>();

        // 添加元素到链表尾部
        linkedList.add("apple");
        linkedList.add("banana");
        linkedList.add("orange");

        // 在链表开头添加元素
        linkedList.addFirst("grape");

        // 在链表末尾添加元素,等同于add方法
        linkedList.addLast("watermelon");

        // 访问链表中的元素
        System.out.println("First fruit: " + linkedList.getFirst());
        System.out.println("Last fruit: " + linkedList.getLast());

        // 获取链表的大小
        System.out.println("Size of linked list: " + linkedList.size());

        // 移除链表中的元素
        linkedList.remove("banana");

        // 使用for循环遍历链表并打印元素
        System.out.println("Elements in the linked list:");
        for (String fruit : linkedList) {
            System.out.println(fruit);
        }
    }
}

        在这个示例中,我们创建了一个LinkedList对象,然后向其中添加了一些元素,并演示了如何在链表的开头和末尾添加元素,以及如何访问和移除链表中的元素。最后,我们使用for循环遍历链表并打印其中的元素。

        通过这个示例,我们可以清晰地了解LinkedList的使用方式以及常用函数的应用场景。

总结:

        链表作为一种重要的数据结构,在Java编程中有着广泛的应用。通过对链表结构和概念的了解,以及对LinkedList常用函数的掌握,我们能够更加灵活地处理数据,实现各种复杂的逻辑。希望本篇博客能够帮助读者加深对Java中链表知识的理解,为实际编程提供帮助。

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

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

相关文章

2023:既是结束也是开始

2023年注定是不平凡的一年&#xff0c;这一年真的经历了很多事&#xff0c;包括学习、生活、工作等等&#xff0c;上半年忙着毕业以及一些其他的事情&#xff0c;很多挖的坑都没来得及填&#xff0c;下半年研一开学以后终于有了足够的时间学习&#xff0c;接下来就用这篇文章来…

【linux】Debian10.0配置vsftpd

一、基本步骤 在 Debian 10 (Buster) 上要配置 vsftpd (Very Secure FTP Daemon)&#xff0c;请按照以下步骤操作&#xff1a; 1. 安装 vsftpd: sudo apt update sudo apt install vsftpd 2. 在启动配置之前&#xff0c;建议备份原始的配置文件: sudo cp /etc/vsftpd.con…

python解释器多版本设置

当你的项目很多&#xff0c;切python版本不一样时&#xff0c;如何为每个项目设置不同的python解释器版本和虚拟环境&#xff1a; 1、安装pyenv brew install pyenv 配置 Pyenv&#xff1a; 将以下内容添加到你的 shell 配置文件&#xff08;如 ~/.bashrc、~/.zshrc 或 ~/.ba…

【c++】初始c++

1. 什么是C 下图就是我们c的祖师爷 C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff0c; 20世纪80年代&#xff0c; 计算…

Ubuntu使用docker-compose安装chatGPT

ubuntu环境搭建专栏&#x1f517;点击跳转 Ubuntu系统环境搭建&#xff08;十五&#xff09;——使用docker-compose安装chatGPT Welcome to the AI era! 使用docker compose安装 在/usr/local文件夹下创建chatgpt mkdir chatgpt创建docker-compose.yaml vim docker-compos…

P2P DMA并不是所有场景都会有性能提升

P2P (Peer-to-Peer) DMA技术理论上可以带来性能提升&#xff0c;特别是在特定的工作负载和场景下。例如&#xff0c;当两个高速设备&#xff08;如GPU与NVMe SSD&#xff09;需要频繁进行大量数据交换时&#xff0c;通过P2P DMA&#xff0c;数据可以直接在设备间传输&#xff0…

【Linux】常见指令解析下

目录 前言1. cp指令&#xff08;重要&#xff09;2. mv指令 &#xff08;重要&#xff09;3. cat指令4. more指令5. less指令 &#xff08;重要&#xff09;6. head指令7. tail指令8. 时间相关的指令8.1 data显示8.2 时间戳 9. cal指令10. find指令&#xff08;非常重要&#x…

[绍棠] docxtemplater实现纯前端导出word

1.下载需要的依赖 2.util文件夹下创建doc.js文件 doc.js import docxtemplater from docxtemplater import PizZip from pizzip import JSZipUtils from jszip-utils import { saveAs } from file-saver import ImageModule from "docxtemplater-image-module-free"…

TCP服务器最多支持多少客户端连接

目录 一、理论数值 二、实际部署 参考 一、理论数值 首先知道一个基础概念&#xff0c;对于一个 TCP 连接可以使用四元组&#xff08;src_ip, src_port, dst_ip, dst_port&#xff09;进行唯一标识。因为服务端 IP 和 Port 是固定的&#xff08;如下图中的bind阶段&#xff0…

利用HTML+CSS+JS打造炫酷时钟网页的完整指南

引言 在现代Web开发中&#xff0c;制作一个引人注目的时钟网页是一种常见而令人愉悦的体验。本文将介绍如何使用HTML、CSS和JavaScript来创建一个炫酷的时钟网页&#xff0c;通过这个项目&#xff0c;你将学到如何结合这三种前端技术&#xff0c;制作一个动态且美观的时钟效果…

SpringMVC数据校验

导包 配置springmvc.xml <bean id"validator" class" org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"><property name"providerClass" value"org.hibernate.validator.HibernateValidator ">…

React16源码: React中的renderRoot的源码实现

renderRoot 1 &#xff09;概述 renderRoot 是一个非常复杂的方法这个方法里处理很多各种各样的逻辑, 它主要的工作内容是什么&#xff1f;A. 它调用 workLoop 进行循环单元更新 遍历整个 Fiber Tree&#xff0c;把每一个组件或者 dom 节点对应的Fiber 节点拿出来单一的进行更…

烟火检测AI边缘计算智能分析网关V4如何通过ssh进行服务器远程运维

智能分析网关V4是一款高性能、低功耗的AI边缘计算硬件设备&#xff0c;它采用了BM1684芯片&#xff0c;集成高性能8核ARM A53&#xff0c;主频高达2.3GHz&#xff0c;并且INT8峰值算力高达17.6Tops&#xff0c;FB32高精度算力达到2.2T&#xff0c;每个摄像头可同时配置3种算法&…

启动低轨道卫星LEO通讯产业与6G 3GPP NTN标准

通讯技术10年一个大跃进&#xff0c;从1990年的2G至2000年的3G网路&#xff0c;2010年的4G到近期2020年蓬勃发展的5G&#xff0c;当通讯技术迈入融合网路&#xff0c;当前的 5G 技术不仅可提供高频宽、低延迟&#xff0c;同时可针对企业与特殊需求以 5G 专网的模式提供各式服务…

vue-微信H5-拍照和视频,加人像框

图片拍照: <template><div><v-easy-camera:fullscreen"true"ref"easyCamera"v-model"pictureData.picture"class"main-camera"><template #header><div class"top"><van-imageclass"…

【跳槽面试】Redis中分布式锁的实现

分布式锁常见的三种实现方式&#xff1a; 数据库乐观锁&#xff1b;基于Redis的分布式锁&#xff1b;基于ZooKeeper的分布式锁。 本地面试考点是&#xff0c;你对Redis使用熟悉吗&#xff1f;Redis中是如何实现分布式锁的。 在Redis中&#xff0c;分布式锁的实现主要依赖于R…

【JavaEE Spring】SpringBoot 配置文件

SpringBoot 配置文件 1. 配置文件的作用1.1 配置文件的说明1.2 SpringBoot 配置文件 2. 配置文件的格式特殊说明 3. properties 配置文件说明3.1 properties 基本语法3.2 读取配置文件3.3 properties 缺点分析 4. yml 配置文件说明4.1 yml 的基本语法4.2 yml 使⽤进阶4.2.1 yml…

Java基础 - 07 Set之Set,AbstractSet

上边几篇&#xff0c;我们对java的List集合进行相关介绍&#xff0c;了解了关于List集合下的相关实现类的方法或者接口。 自本篇开始&#xff0c;将围绕java的Set进行介绍&#xff0c;也是对我java知识的巩固吧&#xff0c;处理业务越多&#xff0c;发现自己对基础知识的薄弱&…

数据结构小项目----通讯录的实现(这里用链表实现) 超详细~~~~૮(˶ᵔ ᵕ ᵔ˶)ა

目录 Contact.h说明&#xff1a; 结构体与头文件的包含&#xff1a; ​编辑 函数在头文件的声明与定义&#xff1a; Contact.c中各个函数的实现&#xff1a; 1.检查链表中的数据是否满了&#xff0c;满了就扩容 2.链表的尾插 3.链表的删除 4.查找名字是否匹配 5.初始化通讯…

Vagrant安装Oracle Data Guard环境示例

在Windows 11下&#xff0c;通过Vagrant安装标准的Data Guard环境&#xff08;默认为non-CDB模式&#xff09;&#xff0c;耗时约26分钟&#xff0c;共生成2台虚机。以下为安装日志&#xff1a; ...host2: Welcome to DGMGRL, type "help" for information.host2: C…