单向和双向链表的区别就在于单向列表的节点只保存了下个节点的地址,而双向链表中每一个节点保存了上下两个节点的地址
单向链表的增删
package main
import (
"fmt"
"os"
)
type HeroNode struct {
No int
Name string
NickName string
Next *HeroNode
}
func InsertHeroNode(head *HeroNode, node *HeroNode) {
tmp := head
for {
if tmp.Next == nil {
break
}
tmp = tmp.Next
}
tmp.Next = node
}
func InsertHeroNode2(head *HeroNode, node *HeroNode) {
tmp := head
flag := true
for {
if tmp.Next == nil {
break
} else if tmp.Next.No > node.No {
break
} else if tmp.Next.No == node.No {
flag = false
break
}
tmp = tmp.Next
}
if !flag {
fmt.Println("排名冲突,不准插入")
return
} else {
node.Next = tmp.Next
tmp.Next = node
}
}
func ShowHeroNode(head *HeroNode) {
if head.Next == nil {
fmt.Println("一团空。。。")
}
tmp := head
for {
if tmp.Next == nil {
return
}
tmp = tmp.Next
fmt.Printf("排名:%v ,姓名:%v ,昵称:%v\n", tmp.No, tmp.Name, tmp.NickName)
}
}
func main() {
head := &HeroNode{}
for {
var key string
fmt.Println("1、输入add 添加一名好汉")
fmt.Println("2、输入get 查看对应排名")
fmt.Println("3、输入show 显示所有好汉")
fmt.Println("4、输入exit 退出好汉系统")
fmt.Print("请输入选项:")
_, err := fmt.Scanln(&key)
if err != nil {
fmt.Println("未知错误:", err, "\t请重新输入")
}
switch key {
case "add":
var no int
var name string
var nickname string
fmt.Print("请输入排名:")
_, err := fmt.Scanln(&no)
if err != nil {
fmt.Println("未知错误:", err, "\t请重新输入")
}
fmt.Print("请输入名字:")
_, err = fmt.Scanln(&name)
if err != nil {
fmt.Println("未知错误:", err, "\t请重新输入")
}
fmt.Print("请输入外号:")
_, err = fmt.Scanln(&nickname)
if err != nil {
fmt.Println("未知错误:", err, "\t请重新输入")
}
hero1 := &HeroNode{Name: name, No: no, NickName: nickname}
InsertHeroNode(head, hero1)
case "show":
ShowHeroNode(head)
case "exit":
os.Exit(0)
default:
fmt.Println("请输入正确选项!!!")
}
}
}
环形链表的增删
package main
import (
"fmt"
)
type CircleLinkNode struct {
No int
Name string
Next *CircleLinkNode
}
func InsertCircleLinkNode(head *CircleLinkNode, node *CircleLinkNode) {
if head.Next == nil {
head.No = node.No
head.Name = node.Name
head.Next = head
fmt.Printf("排名:%v,名字为:%v 的节点加入成功。。。\n", node.No, node.Name)
return
}
tmp := head
for {
if tmp.Next == head {
break
}
tmp = tmp.Next
}
tmp.Next = node
node.Next = head
fmt.Printf("排名:%v,名字为:%v 的节点加入成功。。。\n", node.No, node.Name)
}
func DeleteCircleLinkNode(head *CircleLinkNode, No int) {
if head.Next == nil {
fmt.Println("空空如也。。。")
return
} else if head.Next == head && head.No == No {
head.Next = nil
fmt.Printf("排名:%v 的节点删除成功。。。\n", No)
return
}
tmp := head
flag := false
for {
if tmp.Next.No == No && tmp.Next == head {
head.No = tmp.Next.Next.No
head.Name = tmp.Next.Next.Name
head.Next = tmp.Next.Next.Next
tmp.Next = tmp.Next
flag = true
break
} else if tmp.Next.No == No {
tmp.Next = tmp.Next.Next
flag = true
break
} else if tmp.Next == head {
break
}
tmp = tmp.Next
}
if flag {
fmt.Printf("排名:%v 的节点删除成功。。。\n", No)
}else {
fmt.Printf("排名:%v 的节点删除失败。。。\n", No)
}
}
func ShowCircleLinkNode(head *CircleLinkNode) {
if head.Next == nil {
fmt.Println("空空如也。。。")
return
}
tmp := head
for {
fmt.Printf("排名:%v ,姓名:%v \n", tmp.No, tmp.Name)
if tmp.Next == head {
break
}
tmp = tmp.Next
}
fmt.Println()
}
func main() {
head := &CircleLinkNode{}
head.No = 1
node01 := &CircleLinkNode{No: 1, Name: "Tom"}
InsertCircleLinkNode(head, node01)
node02 := &CircleLinkNode{No: 2, Name: "Jerry"}
InsertCircleLinkNode(head, node02)
node03 := &CircleLinkNode{No: 3, Name: "Spike"}
InsertCircleLinkNode(head, node03)
fmt.Println("删除前 ===================>")
ShowCircleLinkNode(head)
DeleteCircleLinkNode(head, 0)
fmt.Println("删除0后 ===================>")
ShowCircleLinkNode(head)
DeleteCircleLinkNode(head, 1)
fmt.Println("删除1后 ===================>")
ShowCircleLinkNode(head)
DeleteCircleLinkNode(head, 2)
fmt.Println("删除2后 ===================>")
ShowCircleLinkNode(head)
DeleteCircleLinkNode(head, 3)
fmt.Println("删除 3 后 ===================>")
ShowCircleLinkNode(head)
}