开发者学堂课程【Go 语言核心编程 - 数据结构和算法:数据结构和算法-单链表的添加和显示】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/627/detail/9837
数据结构和算法-单链表的添加和显示
内容简介:
一、单链表的应用实例
二、代码实现
三、代码说明
四、代码运行及修改
一、单链表的应用实例
使用带 head 的单向链表实现-水浒英雄排行榜管理,即完成对英雄人物的增删改查(注意:删除和修改查找可以考虑学员独立完成)。
第一种方式说明:
在添加英雄时,直接添加到链表的尾部。
示意图如下:
二、代码实现
对第一种方式代码实现:
首先打开 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)
}
三、代码说明
说明①:在往队列里加数组时,是后面加的,刚才那个数组来实现队列还是挺麻烦的,但是如果用链表来实现,会觉得非常轻松。
说明②:头结点是一个至关重要的点,一旦丢失整条链表都没有用,头结点不能乱动,只要乱动就麻烦。
那既然给了头结点,还得给一个新结点,参考下图:
现在又创建了一个新的,这个叫 HeroNode ,他的名字叫宋江,为了方便区分把框底色设置成为了蓝色,现在要想办法让它们关联起来。
说明③:今天如果自己去写这些代码,会出现很多空指针的错误,这句话就等价于 temp 的 next 指向 HeroNode (参考下图),这时候可以看到,头结点还是头结点,但是它已经指向宋江,假设又加了一个叫卢俊义的人,试试此逻辑是不是能走动,问一个问题,宋江刚刚加进去的时候,它这个结点是不是也是 nil ?
因为没有动过它,所以就是 nil ,卢俊刚刚出来的时候,他的下一个结点其实也是 nil ,根据刚才逻辑,让 temp 指向 head ,然后开始定位 temp ,下一个是不是空的呢?下一个不是空的,于是 temp 移动到宋江,它一看宋江也是空的,因为宋江是最后一个,所以就退出来,然后让 temp 的 next 指向卢俊义,让宋江的这条直线向卢俊义指完了之后,卢俊义也加入到这个大家庭,但是卢俊义的 next 还是空的,所以下一个再加的时候就在卢俊义后面加,以此类推就好,这个逻辑要非常清晰,不然会出现问题。
具体参考下图:
四、代码运行及修改
(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 , 卢俊义, 玉麒麟]= =>