开发者学堂课程【Go 语言核心编程 - 数据结构和算法:数据结构和算法-单链表的删除】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/627/detail/9838
数据结构和算法-单链表的删除
内容简介:
一、代码实现
二、代码说明
三、代码运行及修改
一、代码实现
(1)前言
现在演示删除的功能,删除就是你给我一个 ID ,然后就到里面去找,找的时候仍然要遵循原则,即在找的时候,依然要让 temp 跟下一个 ID 比较,因为如果不跟下一个比较,即使找到了它,也没什么用。
从链表头取,想想怎么去取,如果有一个从队列尾部插入,还有一个从链表的头插入去取,其实就是一个非常经典的链表,而且这个比原先的更好读,那么我们来写一个案例叫删除。
(2)代码实现
首先打开 VSCode ,找到 chapter20/singlelink/main.go ,在它的基础上进行添加删除的功能,添加的代码如下:
//删除一个结点
func DelHeroNode(head *HeroNode, id int) {
temp := head
flag := false
//找到要删除结点的 no ,和 temp 的下一个结点的 no 比较
for {
if temp.next == nil {
//说明到链表的最后
break
} else if temp.next.no == id {
//说明我们找到了
flag = true
break
}
temp = temp.next
}
if flag {
//找到,删除
temp.next = temp.next.next
} else {
fmt.Println(
“
sorry, 要删除的id不存在
”
)
}
再将最后的部分修改为:
func main() {
//1.先创建一个头结点,
head := &HeroNode{}
//2.创建一个新的 HeroNode
hero1 := &HeroNode{
no : 1,
name :
“
宋江
”
,
nickname : “及时雨”,
}
hero2 := &HeroNode{
no : 2,
name :
“
卢俊义
”
,
nickname : “玉麒麟”,
}
hero3 := &HeroNode{
no : 3,
name :
“
林冲
”
,
nickname : “豹子头”,
}
//3.加入
InsertHeroNode2(head,hero3)
InsertHeroNode2(head,hero1)
InsertHeroNode2(head,hero2)
//4.显示
ListHeroNode(head)
//5.删除
fmt.Println()
DelHeroNode(head, 2)
ListHeroNode(head)
}
二、代码说明
说明①:如果这个 flag 为真,就说明确实找到了,如果找到了就删除,那删除怎么删除?
对与下图而言,比如在这个过程中,找到的是二号,那么要删除二号的话,现在temp是在第一个结点,要删除其实很简单,只需要让 temp 的下一个结点指向下一个结点,那如果这样的有什么好处是什么?
当结点在遍历的时候,这个结点就会被抛弃,那会变成什么结点?
会变成一个垃圾结点,可能会想为什么它不是垃圾,它不指向跟别人,因为它指向别人没有用,只有当别人指向它才会有用,所以说这个结点就会被当成垃圾,然后回收器销毁。
具体参考下图:
三、代码运行及修改
(1)运行初代码
将以上代码保存并运行,运行结果如下:
D:\goproject\src\go_code\chapter20\singlelink>go run main.go
[1 ,宋江,及时雨1==>[2,卢俊义,玉麒麟]==>[3,林冲,豹子头1==>
[1 ,宋江,及时雨1==>[3,林冲,豹子头1==>
(2)删除功能
如果要显示删除1,只需将最后的部分修改为:
//5.删除
fmt.Println()
DelHeroNode(head, 1)
ListHeroNode(head)
保存后并运行,运行结果如下:
D:\goproject\src\go_code\chapter20\singlelink>go run main.go
[1 ,宋江,及时雨1==>[2,卢俊义,玉麒麟]==>[3,林冲,豹子头1==>
[2,卢俊义,玉麒麟]==>[3,林冲,豹子头1==>
(3)删除1和3功能
如果要显示删除1和3,只需将最后的部分修改为:
//5.删除
fmt.Println()
DelHeroNode(head, 1)
DelHeroNode(head, 3)
ListHeroNode(head)
D:\goproject\src\go_code\chapter20\singlelink>go run main.go
[1 ,宋江,及时雨1==>[2,卢俊义,玉麒麟]==>[3,林冲,豹子头1==>
[2,卢俊义,玉麒麟]==>