说明:主要演示单链表的添加、显示和删除
一、编写第1种插入方法,在单链表最后加入
package main
import "fmt"
//单链表的添加、显示和删除
//定义一个HeroNode
type HeroNode struct {
no int
name string
nickname string
next *HeroNode // 表示指向下一个结点
}
//给链表插入一个结点
//一、编写第1种插入方法,在单链表最后加入
func InsertHeroNode(head *HeroNode, newHeroNode *HeroNode) {
//1、创建一个辅助结点
temp := head
//2、先找到该链表的最后这个结点
for {
if temp.next == nil { //表示到链表最后
break
}
temp = temp.next // 让temp不断指向下一个结点
}
//3、将newHeroNode加入到链表最后
temp.next = newHeroNode
}
//显示链表的所有结点信息
func ListHeroNode(head *HeroNode) {
//1、创建一个辅助结点
temp := head
//2、判断该链表是不是一个空的链表
if temp.next == nil {
fmt.Println("空空如也")
return
}
//3、遍历这个链表
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: "及时雨",
}
hero2 := &HeroNode{
no: 2,
name: "夫仔",
nickname: "新华字母哥",
}
hero3 := &HeroNode{
no: 3,
name: "森仔",
nickname: "新华吴彦祖",
}
//3.加入
InsertHeroNode(head, hero2)
InsertHeroNode(head, hero3)
InsertHeroNode(head, hero1)
//4.显示
ListHeroNode(head)
}
运行如下:
可以发现插入并不是有序的,下面编写第2种插入方法
二、编写第2种插入方法,根据no的编号从小到大插入
package main
import "fmt"
//单链表的添加、显示和删除
//定义一个HeroNode
type HeroNode struct {
no int
name string
nickname string
next *HeroNode // 表示指向下一个结点
}
/*//给链表插入一个结点
//一、编写第1种插入方法,在单链表最后加入
func InsertHeroNode(head *HeroNode, newHeroNode *HeroNode) {
//1、创建一个辅助结点
temp := head
//2、先找到该链表的最后这个结点
for {
if temp.next == nil { //表示到链表最后
break
}
temp = temp.next // 让temp不断指向下一个结点
}
//3、将newHeroNode加入到链表最后
temp.next = newHeroNode
}*/
//二、编写第2种插入方法,根据no的编号从小到大插入
func InsertHeroNode2(head *HeroNode, newHeroNode *HeroNode) {
//1、创建一个辅助结点
temp := head
flag := true
//2、先找到适当的结点
//让插入的结点no,和temp的下一个结点的no进行比较
for {
if temp.next == nil {
break
} else if temp.next.no > newHeroNode.no { //说明newHeroNode 应该插入temp后面
break
} else if temp.next.no == newHeroNode.no {
//说明已经存在这个no
flag = false
break
}
temp = temp.next
}
if !flag {
fmt.Println("对不起,已经存在no=", newHeroNode.no)
return
} else {
newHeroNode.next = temp.next
temp.next = newHeroNode
}
}
//删除一个结点
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("你要删除的id不存在")
}
}
//显示链表的所有结点信息
func ListHeroNode(head *HeroNode) {
//1、创建一个辅助结点
temp := head
//2、判断该链表是不是一个空的链表
if temp.next == nil {
fmt.Println("空空如也")
return
}
//3、遍历这个链表
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: "及时雨",
}
hero2 := &HeroNode{
no: 2,
name: "夫仔",
nickname: "新华字母哥",
}
hero3 := &HeroNode{
no: 3,
name: "森仔",
nickname: "新华吴彦祖",
}
//3.加入
InsertHeroNode2(head, hero2)
InsertHeroNode2(head, hero3)
InsertHeroNode2(head, hero1)
//4.显示
ListHeroNode(head)
//5.删除
fmt.Println()
DelHeroNode(head, 1)
ListHeroNode(head)
}
测试如下: