[算法通关村] 1.1 单向链表的创建

news2024/11/25 15:54:03

各位读者朋友们,

从今天开始,我将通过博文的形式,概述数据结构中应知必会的基本算法,

由于我更加熟悉 Java 语言,所以全程使用 Java 语言进行叙述,

如果您发现了文章中的错误,请您不吝赐教。

 什么是链表?

        “链表”(Linked List)是一种常见的数据结构,用于存储和组织数据。它是由一系列节点(Node)组成的,每个节点包含两部分:数据指向下一个节点的引用(或指针)。每个节点中的数据可以是任意类型的数据,例如整数、字符、对象等。

        链表中的节点通过指针相互连接,形成一个线性序列。与数组不同,链表的节点在内存中可以不连续存储,因为每个节点都包含指向下一个节点的指针,这使得链表具有动态分配内存的特性。

        链表的主要特点是插入和删除操作的高效性。在链表中插入或删除节点时,只需要调整节点的指针,而不需要移动其他节点,这使得链表在频繁插入和删除操作时比数组更加高效。

链表的类型?

        常见的链表类型有单向链表和双向链表:

  • 单向链表(Singly Linked List):每个节点只包含一个指向下一个节点的指针。它的优点是节点占用的内存空间较小,但缺点是无法直接反向遍历链表。

  • 双向链表(Doubly Linked List):每个节点包含两个指针,一个指向下一个节点,另一个指向前一个节点。这样可以实现双向遍历链表,但相应地,每个节点需要更多的内存空间来存储额外的指针。

单向链表的构建? 

        首先进行逐步分解,最后会给出完整代码。节点的构造如下:

static class Node { // 静态内部类
    public int val;
    public Node next;

    Node(int x) { // 有参构造器
        val = x;
        next = null;
    }
}

        在堆内存中新建节点时,使用的是如下代码:

for (int i = 0; i < array.length; i++) {
    Node newNode = new Node(array[i]);
}

        由上述代码我们可以看出,每一次 for 循环都会产生一个新的 Node 类对象,此前存在栈中的 newNode 对象,一旦没有被引用,就会被 JVM 回收,所以在这里我们需要定义两个 Node 类 “指针” 对象,这里分别命名为 head 和 cur,head 对象作为头结点“指针”,持续指向头结点,而 cur 对象是为了保证新建的节点一直有被引用,不被 JVM 回收,代码及演示如下:

        (演示是为了更容易理解,当值被赋予 null 时,在内存中其实没有指向关系)

Node head = null, cur = null;

         接下来创建第一个 Node 节点,并改变“指针”的指向关系:

Node newNode = new Node(array[i]);
head = newNode;
cur = newNode;

        此时,newNode 临时对象的任务就完成了,可以创建第二个节点了。由于 head 对象已经指向了头结点,所以后续该对象指向对象就不会再变化。而 cur 对象需要操作第一个节点的后继节点指向第二个节点的地址,代码实现及演示如下:

Node newNode = new Node(array[i]);
cur.next = newNode;

        第一个节点已经配置完成,cur 可以指向第二个节点了,之后临时变量 newNode 继续弹栈、建立第三个节点、以此往复,直到循环结束:

cur = newNode;
Node newNode = new Node(array[i]);

        随着此步骤的不断循环,最终就会建立一个链表,我们在 IDEA 中调试,可以发现这种链式结构: 

         最后,给出完整代码:

public static void main(String[] args) {
    int[] a = {1, 2, 3, 4, 5, 6};
    Node head = initLinkedList(a);
    System.out.println(head);
}

private static Node initLinkedList(int[] array) {
    Node head = null, cur = null;
    for (int i = 0; i < array.length; i++) {
        Node newNode = new Node(array[i]);
//      newNode.next = null;
        if (i == 0) {
            head = newNode;
            cur = newNode;
        } else {
            cur.next = newNode;
            cur = newNode;
        }
    }
    return head;
}

static class Node { // 静态内部类
    public int val;
    public Node next;

    Node(int x) {
        val = x;
        next = null;
    }
}

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

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

相关文章

HCIP——OSPF综合实验

OSPF实验 一、实验拓扑二、实验要求三、实验思路四、实验步骤1、配置接口IP地址以及环回2、配置缺省路由3、配置MGRE环境4、配置OSPF5、修改网络类型6、重发布7、配置汇总空接口防环8、配置特殊区域&#xff1a;9、配置NAT环境10、加快收敛11、配置接口认证12、测试 一、实验拓…

ModHeader插件

ModHeader浏览器插件下载装载地址&#xff1a;&#xff08;microsoftedge&#xff09;ModHeader - Modify HTTP headers - Microsoft Edge Addonshttps://microsoftedge.microsoft.com/addons/detail/modheader-modify-http-h/opgbiafapkbbnbnjcdomjaghbckfkglc?refidbingshor…

MySQL 主从复制的认识 2023.07.23

一、理解MySQL主从复制原理 1、概念&#xff1a;主从复制是用来建立一个和 主数据库完全一样的数据库环境称为从数据库&#xff1b;主数据库一般是准实时的业务数据库。 2、作用&#xff1a;灾备、数据分布、负载平衡、读写分离、提高并发能力 3、原理图 4、具体步骤 (1) M…

微服务远程调用openFeign简单回顾

目录 一. OpenFeign简介 二. OpenFeign原理 演示使用 provider模块 消费者模块 配置全局feign日志 示例源代码: 一. OpenFeign简介 OpenFeign是SpringCloud服务调用中间件&#xff0c;可以帮助代理服务API接口。并且可以解析SpringMVC的RequestMapping注解下的接口&#x…

生物信息学_玉泉路_课堂笔记_04 第四章 高通量测序技术与 数据分析

&#x1f345; 课程&#xff1a;生物信息学_玉泉路_课堂笔记 中科院_2022秋季课 第一学期 &#x1f345; 个人笔记使用 &#x1f345; 2023/7/19 测序技术 鸟枪法测序 全球测试仪的使用情况 边合成边测序 深颜色是加的接头 adapter 浅颜色的是要测的片段 insert ① 重叠的情…

【iOS】动态链接器dyld

参考&#xff1a;认识 dyld &#xff1a;动态链接器 dyld简介 dyld&#xff08;Dynamic Linker&#xff09;是 macOS 和 iOS 系统中的动态链接器&#xff0c;它是负责在运行时加载和链接动态共享库&#xff08;dylib&#xff09;或可执行文件的组件。在 macOS 系统中&#xf…

Docker 安装 和 GPU 支持

一、Docker安装过程&#xff08;ubuntu18.04环境&#xff09; 清华镜像 docker 安装&#xff1a;docker-ce | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 1、由于apt官方库里的docker版本可能比较旧&#xff0c;所以先卸载可能存在的旧版本&…

Java 设计模式——原型模式

目录 1.概述2.结构3.实现3.1.浅拷贝3.2.深拷贝3.2.1.通过对象序列化实现深拷贝&#xff08;推荐&#xff09;3.2.2.重写 clone() 方法来实现深拷贝 4.优缺点5.使用场景 1.概述 &#xff08;1&#xff09;原型模式 (Prototype Pattern) 是一种创建型设计模式&#xff0c;是通过…

【2023裸辞失业后之初学RocketMQ】

目录 RocketMQ概述MQ概述常见的MQ产品常见的协议 Rocket的安装和启动基本概念系统架构安装RocketMQ和控制台 RocketMQ概述 MQ概述 Message Queue&#xff1a;是提供消息队列服务的中间件&#xff0c;提供消息生产&#xff0c;存储&#xff0c;消费的全过程。 作用&#xff1a…

刘铁猛C#语言教程——表达式详解1

表达式的定义 对以上文档的翻译&#xff1a; 对以上文档的代码解释&#xff1a;表达式是为了实现具体的算法逻辑并得到一个具体的值&#xff0c;而表达式的返回值可以是一个单值&#xff0c;也可以是实例&#xff0c;方法&#xff0c;或者命名空间&#xff1b;例如&#xff1a;…

微服务入门---SpringCloud(一)

微服务入门---SpringCloud&#xff08;一&#xff09; 1.认识微服务1.0.学习目标1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结 2.服务拆分和远程调用2.1.服务拆分原则2.2.服务拆分示例2.2.1.导入Sql语句2.2.2.导入demo工程 2.3.实现远程调用案例2.3.1.案例需求…

当今网络的基本情况

1 网络表示方法和网络拓扑 1.1 网络表示方法 网络架构师和管理员必须能够展示他们的网络将是什么样子。他们需要能够轻松地看到哪些组件连接到其他组件&#xff0c;它们将位于何处&#xff0c;以及它们将如何连接。网络图通常使用图标&#xff08;如图中所示&#xff09;来表…

基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作方法

文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0c;可直观的展示主题的研究发展历程、研究现状、研究…

数据结构与算法-排序算法

数据结构与算法之排序算法 1 使用递归的方式求最大值2 时间复杂度3 选择排序和冒泡排序的时间复杂度分析4 插入排序时间复杂度分析 (O(N^2))5 二分法的详解与扩展6 对数器7 归并排序8 归并排序的应用9 逆序对问题10 归并排序非递归方式11 快速排序12 堆排序13 桶排序 1 使用递归…

并行计算-OPENMP(windows)

并行计算&#xff08;Parallel Computing&#xff09;是指同时使用多种计算资源解决计算问题的过程&#xff0c;是提高计算机系统计算速度和处理能力的一种有效手段。它的基本思想是用多个处理器来协同求解同一问题&#xff0c;即将被求解的问题分解成若干个部分&#xff0c;各…

深度学习(一)

目录 一、特征工程的作用 二、深度学习的应用 三、得分函数 四、损失函数 五、前向传播 六、反向传播 一、特征工程的作用 数据特征决定了模型的上限预处理和特征提取是最核心的算法与参数选择决定了如何逼近这个上限 二、深度学习的应用 无人驾驶人脸识别分辨率重构 深…

国产龙芯2k1000开发板运行SylixOS嵌入式实时系统--迅为电子

龙芯生态体系越来越完善&#xff0c;继RK3568开发板成功搭载SylixOS国产实时操作系统后&#xff0c;迅为的国产龙芯2K1000开发平台也可以流畅运行SylixOS国产实时操作系统了。 SylixOS 采用抢占式、多任务、硬实时的方式来设计整个操作系统。已广泛适用于电力、工业自动化、轨道…

为什么要配置环境变量(深析)

为什么要配置环境变量&#xff08;深析&#xff09; 前言&#xff1a;大家学习java首先听到的就是jdk&#xff0c;配置环境变量&#xff0c;当时我听到这个也一脸雾水&#xff0c;这是个什么东西&#xff0c;当时就稀里糊涂跟着老师一步步下载安装&#xff0c;弄好了也不知道是…

安全基础 --- html基础标签 + DNS工作原理

html基础标签 &#xff08;1&#xff09;id id属性是元素在网页内的唯一标识符。 比如&#xff0c;网页可能包含多个<p>标签&#xff0c;id属性可以指定每个<p>标签的唯一标识符。 <p id"p1"></p> <p id"p2"></p>…

UE4/5C++多线程插件制作(十四、MTPAbandonable)

MTPAbandonable 在头文件中创建新的文件夹,MTPAbandonable,里面是MTPAbandonable.h,cpp也一样如此: h实现 构造函数接受一个FSimpleDelegate类型的参数InThreadDelegate,用于指定任务在后台线程中执行时要执行的操作。 DoWork()函数定义了任务的具体执行逻辑,需要根据…