链表的定义
- 链表是以节点的方式来存储,是链式存储
- 每个节点包含 data 域, next 域:指向下一个节点.
- 如图:发现链表的各个节点不一定是连续存储.
- 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定
1.构造一个链表节点
type HeroNode struct {
no int
name string
nickname string
next *HeroNode
}
2.首先插入链表节点
func InsertHeroNode2(head *HeroNode, newHeroNode *HeroNode) {
//先找到该链表的最后结点
temp := head
flag := true
for {
if temp.next == nil {
break //代表找到了最后
} else if temp.next.no >= newHeroNode.no {
break
} else if temp.next.no == newHeroNode.no {
flag = false
break
}
temp = temp.next
}
if !flag {
fmt.Println("对不起,已经存在 no=", newHeroNode.no)
return
} else {
newHeroNode.next = temp.next //把交换的节点的下一个给上一个
temp.next = newHeroNode // 当前节点的下一个给 新插入的
}
}
整体思路框架:
考虑这几点:
1.给予一个头节点,让它为空。
2.第二个判断是否为空链表
3.根据no来判断插入的位置
4.是否插入的位置为最后
3.打印出链表
很简单两步:
1.考虑是否为空链表
2.就一直循环,为空break就行
func ListHeroNode(head *HeroNode) {
temp := head
// 先判断该链表是不是一个空的链表
if temp.next == nil {
fmt.Println("空空如也。。。。")
return
}
for {
fmt.Printf("[%d , %s , %s]--->", temp.next.no, temp.next.name, temp.next.nickname)
temp = temp.next
if temp.next == nil {
break
}
}
}
4.删除链表
func DeleteLinkedlist(head *HeroNode, forDeleteNode *HeroNode) {
temp := head
flag := true
if temp.next == nil {
fmt.Println("这个链表为空,不能删除")
}
for {
if temp.next == nil {
fmt.Println("找到最后还没有找到,不存在这个删除点")
break
} else if temp.next.no == forDeleteNode.no {
fmt.Println("找到了这个节点 删除了这个节点", forDeleteNode)
if temp.next.next == nil {
flag = false
break
}
break
}
temp = temp.next
}
if flag {
temp.next = forDeleteNode.next
} else {
temp.next = nil
}
}
思路架构图
5.更新节点
跟删除同理
func UpLinkedList(head *HeroNode, upDateNode *HeroNode) {
temp := head
flag := true
if temp.next == nil {
fmt.Println("不存在这个链表不能更新")
}
for {
if temp.next == nil {
fmt.Println("找到最后还没有找到,不存在这个更新点")
break
} else if temp.next.no == upDateNode.no {
fmt.Println("找到了存在的更新点", *temp.next)
if temp.next.next == nil {
flag = false
break
}
break
}
temp = temp.next
}
if flag {
upDateNode.next = temp.next.next
temp.next = upDateNode
} else {
temp.next = upDateNode
}
}
6.全部代码
package main
import "fmt"
/* 链表的定义
1) 链表是以节点的方式来存储,是链式存储
2) 每个节点包含 data 域, next 域:指向下一个节点.
3) 如图:发现链表的各个节点不一定是连续存储.
4) 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确
需求:
1. 完成链表的创建、增加、删除、更新、查看
*/
type HeroNode struct {
no int
name string
nickname string
next *HeroNode
}
// 这种插入不推荐
func InsertHeroNode(head *HeroNode, newHeroNode *HeroNode) {
//先找到该链表的最后结点
temp := head
for {
if temp.next == nil {
break //表示找到
}
temp = temp.next //没找到 就继续找
}
// 3.将新来的结点放在最后
temp.next = newHeroNode
}
// 考虑 根据编号来进行链表排序
func InsertHeroNode2(head *HeroNode, newHeroNode *HeroNode) {
//先找到该链表的最后结点
temp := head
flag := true
for {
if temp.next == nil {
break //代表找到了最后
} else if temp.next.no >= newHeroNode.no {
break
} else if temp.next.no == newHeroNode.no {
flag = false
break
}
temp = temp.next
}
if !flag {
fmt.Println("对不起,已经存在 no=", newHeroNode.no)
return
} else {
newHeroNode.next = temp.next //把交换的节点的下一个给上一个
temp.next = newHeroNode // 当前节点的下一个给 新插入的
}
}
//删除链表
/*
三种情况,1.没有节点,还有没找到也就是说不存在
2.通常情况,有节点
3.节点在末尾
*/
func DeleteLinkedlist(head *HeroNode, forDeleteNode *HeroNode) {
temp := head
flag := true
if temp.next == nil {
fmt.Println("这个链表为空,不能删除")
}
for {
if temp.next == nil {
fmt.Println("找到最后还没有找到,不存在这个删除点")
break
} else if temp.next.no == forDeleteNode.no {
fmt.Println("找到了这个节点 删除了这个节点", forDeleteNode)
if temp.next.next == nil {
flag = false
break
}
break
}
temp = temp.next
}
if flag {
temp.next = forDeleteNode.next
} else {
temp.next = nil
}
}
// 跟删除同理
func UpLinkedList(head *HeroNode, upDateNode *HeroNode) {
temp := head
flag := true
if temp.next == nil {
fmt.Println("不存在这个链表不能更新")
}
for {
if temp.next == nil {
fmt.Println("找到最后还没有找到,不存在这个更新点")
break
} else if temp.next.no == upDateNode.no {
fmt.Println("找到了存在的更新点", *temp.next)
if temp.next.next == nil {
flag = false
break
}
break
}
temp = temp.next
}
if flag {
upDateNode.next = temp.next.next
temp.next = upDateNode
} else {
temp.next = upDateNode
}
}
// 打印出来链表
func ListHeroNode(head *HeroNode) {
temp := head
// 先判断该链表是不是一个空的链表
if temp.next == nil {
fmt.Println("空空如也。。。。")
return
}
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() {
// 创建节点
head := &HeroNode{} //这是一个头节点
hero1 := &HeroNode{
no: 1,
name: "宋江",
nickname: "及时雨",
}
//
hero2 := &HeroNode{
no: 2,
name: "卢俊义",
nickname: "玉麒麟",
}
hero3 := &HeroNode{
no: 3,
name: "林冲",
nickname: "豹子头",
}
//InsertHeroNode(head, hero1)
//InsertHeroNode(head, hero2)
//InsertHeroNode(head, hero3)
InsertHeroNode2(head, hero3)
InsertHeroNode2(head, hero2)
InsertHeroNode2(head, hero1)
ListHeroNode(head)
//fmt.Println("这是hero1:", &hero1)
fmt.Println("")
fmt.Println("删除后")
DeleteLinkedlist(head, hero2)
ListHeroNode(head)
hero4 := &HeroNode{
no: 3,
name: "吴用",
nickname: "智多星",
}
UpLinkedList(head, hero4)
ListHeroNode(head)
}