数据结构和算法-单链表的添加和显示|学习笔记

简介: 快速学习数据结构和算法-单链表的添加和显示

开发者学堂课程【Go 语言核心编程 - 数据结构和算法:数据结构和算法-单链表的添加和显示】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/627/detail/9837


数据结构和算法-单链表的添加和显示


 内容简介:

一、单链表的应用实例

二、代码实现

三、代码说明

四、代码运行及修改


一、单链表的应用实例

使用带 head 的单向链表实现-水浒英雄排行榜管理,即完成对英雄人物的增删改查(注意:删除和修改查找可以考虑学员独立完成)。

第一种方式说明:

在添加英雄时,直接添加到链表的尾部。

示意图如下:

image.png

 

二、代码实现

对第一种方式代码实现:

首先打开 VSCode ,在 chapter20 中新建一个文件夹为 singlelink ,再在其内新建一个文件称为 main.go ,在其内输入以下代码:

package main

import (

fmt

)

//定义一个 HeroNode

type HeroNode struct {

no       int

Name     string

nickname string

Next     *HeroNode  //这个表示指向下一个结点

}

//给链表插入一个结点

//编写第一种插入方式,在单链表的最后加入

func InsertHeroNode(head *HeroNode, newHeroNode *HeroNode) {

//思路

//1.先控制该链表的最后这个结点

//2.创建一个辅助结点[跑龙套,帮忙]

temp := head

for {

if temp.next == nil {

break

}

temp = temp.next //让 temp 不断的指向下一个结点

}

//3.将 newHeroNode 加入到链表的最后

temp.next = newHeroNode

}

//显示链表的所有结点信息

func ListHeroNode(head *HeroNode) {

//1.创建一个辅助结点[跑龙套,帮忙]

temp := head

//先判断该链表是不是一个空的链表

if temp.next == nil {

fmt.Println(空空如也。。。。)

}

//2.遍历这个链表

for {

fmt.Printf([%d, %s, %s]==>, temp.next.no,

temp.next.name, temp.next.nickname)

//判断是否链表后

temp = temp.next

if temp.next == nil {

break

}

}

}

func main() {

/1.先创建一个头结点,

head := &HeroNode{}

//2.创建一个新的HeroNode

hero1 := &HeroNode{

no : 1,

name : 宋江,

nickname : “及时雨”,

} 

//3.加入

InsertHeroNode(head,hero1)

//4.显示

ListHeroNode(head)

}

 

三、代码说明

说明①:在往队列里加数组时,是后面加的,刚才那个数组来实现队列还是挺麻烦的,但是如果用链表来实现,会觉得非常轻松。

说明②:头结点是一个至关重要的点,一旦丢失整条链表都没有用,头结点不能乱动,只要乱动就麻烦。

那既然给了头结点,还得给一个新结点,参考下图:

image.png

现在又创建了一个新的,这个叫 HeroNode ,他的名字叫宋江,为了方便区分把框底色设置成为了蓝色,现在要想办法让它们关联起来

说明③:今天如果自己去写这些代码,会出现很多空指针的错误,这句话就等价于 temp 的 next 指向 HeroNode (参考下图),这时候可以看到,头结点还是头结点,但是它已经指向宋江,假设又加了一个叫卢俊义的人,试试此逻辑是不是能走动,问一个问题,宋江刚刚加进去的时候,它这个结点是不是也是 nil ?

因为没有动过它,所以就是 nil ,卢俊刚刚出来的时候,他的下一个结点其实也是 nil ,根据刚才逻辑,让 temp 指向 head ,然后开始定位 temp ,下一个是不是空的呢?下一个不是空的,于是 temp 移动到宋江,它一看宋江也是空的,因为宋江是最后一个,所以就退出来,然后让 temp 的 next 指向卢俊义,让宋江的这条直线向卢俊义指完了之后,卢俊义也加入到这个大家庭,但是卢俊义的 next 还是空的,所以下一个再加的时候就在卢俊义后面加,以此类推就好,这个逻辑要非常清晰,不然会出现问题。

具体参考下图:

image.png

四、代码运行及修改

(1)运行初代码

将以上代码保存并运行,运行结果如下:

D:\goproject\src\go_code\chapter20\circelqueue>cd ..

D:\goproject\src\go_code\chapter20>cd singlelink

D:\goproject\src\go_code\chapter20\singlelink>go run main.go

[1 , 宋江 , 及时雨1==>

(2)对代码进行添加修改处理

从运行结果来看,只有一个人,再添加一个人试试是否运行正确,在以上代码的两处相应位置进行添加,

如下: 

//2.创建一个新的 HeroNode

hero1 := &HeroNode{

no : 1,

name : 宋江,

nickname : “及时雨”,

}

Hero2 := &HeroNode{

no : 2,

name : 卢俊义,

nickname : “玉麒麟”,

}

还有一处是在最后的位置添加,如下:

//3.加入

InsertHeroNode(head,hero1)

InsertHeroNode(head,hero2)

//4.显示

ListHeroNode(head)

(3)运行修改后的代码

添加完成之后,保存并运行代码,运行结果如下:

D:\goproject\src\go_code\chapter20\singlelink>go run main.go

[1 , 宋江 , 及时雨1= =>[2 , 卢俊义, 玉麒麟]= =>

相关文章
|
3月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
92 1
|
3月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
109 0
|
7月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
216 10
 算法系列之数据结构-二叉树
|
7月前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
173 3
 算法系列之数据结构-Huffman树
|
7月前
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
234 22
|
6月前
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
125 0
|
25天前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
143 3
|
1月前
|
存储 编解码 算法
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
|
20天前
|
机器学习/深度学习 算法 数据可视化
基于MVO多元宇宙优化的DBSCAN聚类算法matlab仿真
本程序基于MATLAB实现MVO优化的DBSCAN聚类算法,通过多元宇宙优化自动搜索最优参数Eps与MinPts,提升聚类精度。对比传统DBSCAN,MVO-DBSCAN有效克服参数依赖问题,适应复杂数据分布,增强鲁棒性,适用于非均匀密度数据集的高效聚类分析。
|
20天前
|
开发框架 算法 .NET
基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA
简介:本文介绍基于ADMM的MIMO信号检测算法,结合无穷范数优化与交替方向乘子法,降低计算复杂度并提升检测性能。涵盖MATLAB 2024b实现效果图、核心代码及详细注释,并对比ML、MMSE、ZF、OCD_MMSE与LAMA等算法。重点分析LAMA基于消息传递的低复杂度优势,适用于大规模MIMO系统,为通信系统检测提供理论支持与实践方案。(238字)

热门文章

最新文章