可视化+图解链表

news2025/3/13 4:17:55

链表(Linked list)是一种常用的数据结构,它由一系列节点组成,每个节点包含数据域指针域。指针域存储了下一个节点的地址,从而建立起各节点之间的线性关系。

1、链表节点

1.1 节点构成

链表节点如下图所示:

其中,数据域可以是一个int、string、float或者数组等复杂结构。

1.2 节点表示

1.2.1 Golang语言

Go语言中的数据类型可以分为四大类:基础类型、聚合类型、引用类型和接口类型。

基础类型是构成编程语言的基础元素,包括整数、浮点数、布尔值和字符串等。在Go语言中,整型分为有符号和无符号整数,例如int8、int16、int32、int64等。此外,Go语言还支持基于架构的类型,例如uintptr。

聚合类型是由基础类型构成的复合数据类型,主要包括数组和结构体两种。数组由一组相同类型的元素组成,长度固定;结构体则由一组不同类型的元素(字段)组成,长度也是固定的。

引用类型是对底层数据进行抽象表示的类型,包括指针、切片、映射(也称为map)、函数和通道(channel)。指针提供了对底层变量的间接访问方式,切片是对数组的抽象,映射是一种关联数组,函数和通道则是特殊的引用类型,用于表示执行代码和传输数据。

接口类型是Go语言中的一种特殊类型,它定义了一组方法(函数),但是这些方法不包含(实现)代码。任何其他类型只要实现了这些方法就可以被看作是这个接口类型的实例。

因此,对于 Golang语言来说,只有结构体才可以表示链表的节点。

// ListNode 定义链表节点
type ListNode struct {
    Val  int       //链表的数据域
    Next *ListNode //链表的指针域
}

1.2.2 Java语言

基本数据类型:包括整型(byte、short、int、long)、浮点型(float、double)、字符型(char)和布尔型(boolean)。

引用数据类型:包括类(class)、接口(interface)、数组(array)和枚举(enum)。

特殊数据类型:包括void、String、Object等。

因此,对于 Java语言来说,只有类(class)才可以表示链表的节点。

//定义链表节点
    static class ListNode {
        private int val;  //链表的数据域
        private ListNode next; //链表的指针域
​
        public ListNode(int val) {
            this.val = val;
            this.next = null;
        }
​
    }

1.2.3 Python语言

Python语言中有几种主要的数据类型,包括: 数字:Python可以处理整数(int)、浮点数(float)、复数(complex)。 字符串:字符串是Python中的文本数据类型,由零个或多个字符组成。 布尔值:布尔值是Python中的逻辑数据类型,有两个可能的值:True和False。 列表:列表是Python中的有序集合,可以包含任意类型的数据项。 元组:元组与列表类似,是有序的集合,但是元组是不可变的,这意味着你不能更改元组中的元素。 集合:集合是无序的、不重复的元素序列。 字典:字典是无序的键值对集合,键是唯一的。 None:None是一个特殊的类型,表示空或没有值。 自定义类和对象:Python允许用户定义自己的数据类型,即类。对象是类的实例。

因此,对于 Python语言来说,只有自定义类才可以表示链表的节点。

#定义链表节点
class ListNode:
    def __init__(self, data):
        self.val = data  # 链表的数据域
        self.next = None  # 链表的指针域

2、新建链表

创建链表代码实例如下:

  • go代码:

    head := &ListNode{Val: 1}

    java代码

  • ListNode head = new ListNode(1);

    Python代码

  • head = ListNode(1)

    生成的链表结构如下图所示:

创建了一个链表,该链表只有一个节点,数据域的值为1,指针域指默认指向为Null。创建的链表只有一个节点,通过变量head指向它,后续就可以通过head变量来操作此链表了。

3、链表添加节点

原链表结构如下图所示:

给链表添加一个节点的代码实例如下:

  • go代码:

    head.Next = &ListNode{Val: 123} //更改原链表节点的指针域,让它指向一个新的节点

    java代码

  • head.next = new ListNode(123); //更改原链表节点的指针域,让它指向一个新的节点

    Python代码

  • head.next = ListNode(123)  # //更改原链表节点的指针域,让它指向一个新的节点

    添加节点之后,链表结构如下所示:

原链表节点head的指针域next从指向Null改为指向123这个节点了。

如果要在链表默认增加2个节点,可以这样操作:

  • go代码:

    head.Next.Next = &ListNode{Val: 456} //给head 指针变量指向节点的 下下节点 添加节点
    head.Next.Next.Next = &ListNode{Val: 789}

    java代码

  •  head.next.next = new ListNode(456);  //给head 指针变量指向节点的 下下节点 添加节点
     head.next.next.next = new ListNode(789);

    Python代码

  • head.next.next = ListNode(456)  # 给head 指针变量指向节点的 下下节点 添加节点
    head.next.next.next = ListNode(789)

    添加2个节点之后,链表结构如下所示:

4、链表节点删除

链表结构如下所示:

如果要删除数据域为456、789的这样的两个节点,可以如下操作:

  • go代码:

    head.Next.Next = nil           // 通过head指针变量操作链表的指针域:截断链表

    java代码

  • head.next.next = null;  // 通过head指针变量操作链表的指针域:截断链表

    Python代码

  • head.next.next = None  # 通过head指针变量操作链表的指针域:截断链表

    删除节点之后,链表结构如下所示:

经过操作系统的GC(Garbage Collection,垃圾收集器。用于自动管理内存并回收不再使用的对象所占用的资源)对不用的节点进行回收之后,链表结构如下图所示。

5、小结

今天对链表的基本操作进行了说明,其实还有很多需要加以了解的内容,如:链表打印、对链表的操作进行封装(操作链表更方便)等,鉴于篇幅的限制,再次就不展开了。

如果以上文字描述的不是很清楚或者想进一步了解链表相关操作,请参考视频详细讲解。

       Python编码实现:哔哩哔哩_bilibili

       Java编码实现:数据结构笔试面试算法-Java语言版_哔哩哔哩_bilibili

       Golang编码实现:哔哩哔哩_bilibili

对于链表的相关操作,我们总结了一套【可视化+图解】方法,依据此方法来解决链表相关问题,链表操作变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:雄关漫道真如铁,而今迈步从头越。

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

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

相关文章

Docker参数,以及仓库搭建

一。Docker的构建参数 注释: 1.对于CMD,如果不想显示,而是使用交互界面:docker run -ti --rm --name test2 busybox:v5 sh 2.对于CMD,一个交互界面只可以使用一个,如果想多次使用CMD,则用ENTR…

正十七边形尺规作图证明——从高斯的发现到几何实现

正十七边形尺规作图证明——从高斯的发现到几何实现 1. 引言:一个历史性的数学突破 在欧几里得几何中,尺规作图(仅使用直尺和圆规)是最为基础的几何构造方法。古希腊数学家已知如何构造正三角形、正方形和正五边形,但…

常见Web应用源码泄露问题

文章目录 前言一、常见的源码泄露漏洞git源码泄露SVN源码泄露DS_Store文件泄漏网站备份压缩文件泄露WEB-INF/web.xml泄露CVS泄露.hg源码泄露Bazaar/bzr泄露.swp文件泄露 前言 在Web应用方面对于安全来说,可能大家对SQL注入、XSS跨站脚本攻击、文件上传等一些漏洞已…

使用Modelsim手动仿真

FPGA设计流程 在设计输入之后,设计综合前进行 RTL 级仿真,称为综合前仿真,也称为前仿真或 功能仿真。前仿真也就是纯粹的功能仿真,主旨在于验证电路的功能是否符合设计要求,其特点是不考虑电路门延迟与线延迟。在完成一个设计的代码编写工作之后,可以直接对代码进行仿真,…

利用 ArcGIS Pro 快速统计省域各市道路长度的实操指南

在地理信息分析与处理的工作中,ArcGIS Pro 是一款功能强大的 GIS 软件,它能够帮助我们高效地完成各种复杂的空间数据分析任务。 现在,就让我们一起深入学习如何借助 ArcGIS Pro 来统计省下面各市的道路长度,这一技能在城市规划、…

1.4 单元测试与热部署

本次实战实现Spring Boot的单元测试与热部署功能。单元测试方面,通过JUnit和Mockito等工具,结合SpringBootTest注解,可以模拟真实环境对应用组件进行独立测试,验证逻辑正确性,提升代码质量。具体演示了HelloWorld01和H…

掌握Kubernetes Network Policy,构建安全的容器网络

在 Kubernetes 集群中,默认情况下,所有 Pod 之间都是可以相互通信的,这在某些场景下可能会带来安全隐患。为了实现更精细的网络访问控制,Kubernetes 提供了 Network Policy 机制。Network Policy 允许我们定义一组规则&#xff0c…

结合rpart包的决策树介绍

决策树与CART算法 决策树是一种基于树状结构的监督学习算法。它通过从根节点开始递归地对特征进行划分,构建出一棵树来进行决策。决策树的构建过程需要解决的重要问题有三个:如何选择自变量、如何选择分割点、确定停止划分的条件。解决这些问题是希望随…

VScode代码格式化插件black失效问题

之前有如下提示: 没太当回事,发现还能用。之后突然就用不了了,跟着官方插件的文档来查看log: 查看发现提示: Message: TypeError: type object is not subscriptable 在github界面找到解决方案:安装Versio…

【经验分享】Ubuntu20.04编译RK3568 AI模型报错问题(已解决)

【经验分享】Ubuntu20.04编译RK3568 AI模型报错问题(已解决) 前言问题现象问题分析解决方案总结 前言 这里使用的是Rockchip提供的rknn_model_zoo,https://github.com/airockchip/rknn_model_zoo/tree/main 此解决方案适用于Rockchip芯片在U…

AI革命先锋:DeepSeek与蓝耘通义万相2.1的无缝融合引领行业智能化变革

云边有个稻草人-CSDN博客 目录 引言 一、什么是DeepSeek? 1.1 DeepSeek平台概述 1.2 DeepSeek的核心功能与技术 二、蓝耘通义万相2.1概述 2.1 蓝耘科技简介 2.2 蓝耘通义万相2.1的功能与优势 1. 全链条智能化解决方案 2. 强大的数据处理能力 3. 高效的模型…

基于SpringBoot实现旅游酒店平台功能一

一、前言介绍: 1.1 项目摘要 随着社会的快速发展和人民生活水平的不断提高,旅游已经成为人们休闲娱乐的重要方式之一。人们越来越注重生活的品质和精神文化的追求,旅游需求呈现出爆发式增长。这种增长不仅体现在旅游人数的增加上&#xff0…

轻松上手 —— 通过 RPM 包快速部署 NebulaGraph

前言 在当今大数据时代,处理复杂关系数据的需求与日俱增,图数据库应运而生并逐渐崭露头角。NebulaGraph 作为一款高性能、分布式且易扩展的图数据库,专为应对大规模图数据处理而精心打造。它不仅具备丰富的查询语言,还拥有强大高效…

MetaGPT发布的MGX与Devin深度对比

家人们,搞编程的都知道,工具选对了,效率能翻倍!今天必须给大伙唠唠MetaGPT发布的MGX编程助手和Devin编程助手 。 先看MGX,简直是编程界的王炸!它就像一个超神的虚拟开发团队,一堆智能助手分工明…

03.06 QT

一、使用QSlider设计一个进度条&#xff0c;并让其通过线程自己动起来 程序代码&#xff1a; <1> Widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QThread> #include "mythread.h"QT_BEGIN_NAMESPACE namespace Ui {…

SpringUI:打造高质量Web交互设计的首选元件库

SpringUI作为一个专为Web设计与开发领域打造的高质量交互元件库&#xff0c;确实为设计师和开发者提供了极大的便利。以下是对SpringUI及其提供的各类元件的详细解读和一些建议&#xff1a; SpringUI概述 SpringUI集合了一系列预制的、高质量的交互组件&#xff0c;旨在帮助设…

鸿蒙Android4个脚有脚线

效果 min:number122max:number150Row(){Stack(){// 底Text().border({width:2,color:$r(app.color.yellow)}).height(this.max).aspectRatio(1)// 长Text().backgroundColor($r(app.color.white)).height(this.max).width(this.min)// 宽Text().backgroundColor($r(app.color.w…

夏门大学DeepSeek 手册:从社会大众到高校及企业的全面应用实践研究(附 PDF 下载)

这 3 份手册分别从 DeepSeek 大模型概念、技术与应用实践、DeepSeek 大模型赋能高校教学和科研、DeepSeek 大模型及其企业应用实践-企业人员的大模型宝典几个角度进行全面分析&#xff0c;可以结合着清华、北大系列相互对照着学习。 清华北大推出的 DeepSeek 教程&#xff08;…

策略模式详解:实现灵活多样的支付方式

多支付方式的实现&#xff1a;策略模式详解 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以互换使用。策略模式使得算法可以独立于使用它的客户端变化。本文将通…

【Java篇】算术如诗,逻辑似梦:Java 编程中的运算符探寻

文章目录 Java 运算符&#xff1a;在计算与逻辑之中追寻编程的哲理1.前言2. 算术运算符2.1 基本四则运算符&#xff1a;加减乘除&#xff08; - * / %&#xff09;2.2 除法与取余2.3 增量运算符&#xff08; --&#xff09;2.4 自增/自减运算符 3. 关系运算符3.1 关系运算符 4.…