可视化+图解:轻松搞定链表

news/2025/3/11 11:09:02/文章来源:https://www.cnblogs.com/jiangzhou/p/18759050

链表(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编码实现:https://www.bilibili.com/cheese/play/ep1370256

  • Java编码实现:https://www.bilibili.com/cheese/play/ep1366712

  • Golang编码实现:https://www.bilibili.com/cheese/play/ep1364389

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FastAPI+OpenAI实现Telegram问答机器人

首先要创建一个机器人,找到BotFather获取到机器人的Token设置后台地址,实现消息转发 curl -X POST "https://api.telegram.org/bot{机器人token}/setWebhook?url=https://chat.xxxxxxxx.com/chat"配置文件 .env OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx…

dat格式和mmdb格式IP数据库下载源

MaxMind 提供了免费的 IP 地域数据库,早期的dat格式的ip库MaxMind 官方已经停止支持。 现在MaxMind 官方提供的mmdb格式需要注册后才能下载。 本文记录找到的其它下载源。 dat格式下载:https://www.miyuru.lk/geoiplegacy下载国家IP库(包含ipv4和ipv6),解压并重命名:wget …

Linux 平均负载 Load Average 详解

转载自Linux 平均负载 Load Average 详解_load average多少是正常-CSDN博客 一、什么是Load Average? 系统负载(System Load)是系统CPU繁忙程度的度量,即有多少进程在等待被CPU调度(进程等待队列的长度)。 平均负载(Load Average)是一段时间内系统的平均负载,这个一段…

Linux 中 sh -c

001、[root@PC1 test]# ls a.sh [root@PC1 test]# cat a.sh #!/bin/bash echo hello world [root@PC1 test]# sh -c bash a.sh ## 更新了系统环境变量? (base) [root@PC1 test]# (base) [root@PC1 test]# conda deactivate [root@PC1 test]# ls a.sh [root@PC1 test]#…

跑步名词

跑步名词 1. 跑步机上的速度6指的是多少跑步机上的速度指的是每小时几公里(km/h)所以跑步机上的速度“6”通常指的是每小时6公里(km/h)。 2. 配速是什么意思 配速(Pace)是跑步运动中常用的术语,指的是完成每公里(或每英里)需要几分钟。 它是衡量跑步速度的一种方式,通…

探秘Transformer系列之(11)--- 掩码

从零开始解析Transformer,目标是:(1) 解析Transformer如何运作,以及为何如此运作,让新同学可以入门;(2) 力争融入一些比较新的或者有特色的论文或者理念,让老鸟也可以有所收获。探秘Transformer系列之(11)--- 掩码 目录探秘Transformer系列之(11)--- 掩码0x00 概述0x…

私有云电脑的技术原理,干货多多

当我们谈论现代科技如何改变生活和工作时,远程连接无疑是一个重要的话题:它是一种能够让用户在远离设备物理位置的情况下,依然能够对其进行操作和管理的技术。通过远程连接,我们可以跨越城市、国家甚至洲际距离,实现对远程计算机、服务器、网络设备等的实时控制,这在很大…

NeoBERT:4096 tokens上下文窗口,参数更少但性能翻倍

NeoBERT代表了双向编码器模型的新一代技术发展,通过整合前沿架构改进、现代大规模数据集和优化的预训练策略,有效缩小了传统编码器与高性能自回归语言模型之间的性能差距。该模型在支持4096 tokens的扩展上下文窗口的同时,仅维持250M参数规模的紧凑设计。值得注意的是,尽管…

【第四章 定时任务】手把手教你玩转新版正点原子云

【第四章 定时任务】手把手教你玩转新版正点原子云 承接上篇,除了报警联动这个功能,原子云还有一个特色功能也是各开发者喜欢用的,定时任务功能。 【正点原子】云平台:原子云(点击登录原子云) 前言: 定时任务可以在云平台定时、定向地向设备发送数据。比如在设定好定时任…

IDEA-MyBatisCodeHelperPro插件免激活离线安装根据实体类创建create建表语句

MyBatisCodeHelperPro插件免激活离线安装&根据实体类创建create建表语句 通过网盘分享的文件:MyBatisCodeHelper-Pro.zip 链接: https://pan.baidu.com/s/1Yg-ENwXY0MseR2DjFu9uHQ?pwd=sky1 提取码: sky1 一、File -> Setting -> Plugin -> Install Plugin Disk…

优化Hyper-V:合理设定CPU核数的教程

优化Hyper-V虚拟机的CPU核数配置,是提高虚拟机性能和整体虚拟化环境效率的关键步骤。以下是一份详细的教程,指导您如何合理设定Hyper-V虚拟机的CPU核数。一、了解CPU核数配置的基本原则 根据工作负载需求设定: 轻量级应用:如文件共享、简单的Web服务等,通常分配1-2个虚拟C…