首页 > 编程语言 > 详细

go语言数据结构之-环形单链表

时间:2021-07-24 00:05:38      阅读:15      评论:0      收藏:0      [点我收藏+]
package main

import "fmt"

type CatNode struct {
num int
name string
next *CatNode
}

//相对来说为尾部插入
func InsertCatNode(head *CatNode, newNode *CatNode) {
//如果是第一次插入
if head.next == nil {
head.num = newNode.num
head.name = newNode.name
head.next = head //相当于把newnode这个节点覆盖我们设置的头结点,但是头结点下一次还得指向自己形成闭环
fmt.Println("插入第一只猫:", newNode.name, "成功")
return
}
//不是第一个节点
temp := head //用temp去遍历
for {
if temp.next == head {
break
}
temp = temp.next
}
temp.next = newNode
newNode.next = head
fmt.Printf("%d猫%s插入成功 --》\t", newNode.num, newNode.name)
}

//显示环形链表
func ShowCatNode(head *CatNode) {
fmt.Println()
fmt.Println("环形队列如下:")

if head.next == nil {
fmt.Println("空的")
return
}
temp := head //用temp去遍历
for {
fmt.Printf("%d猫%s --》\t", temp.num, temp.name)
if temp.next == head {
break
}
temp = temp.next
}
}

//删除节点,删除num为某值的节点
func DelCatNode(head *CatNode, id int) *CatNode { //要返回一个节点的原因是如果是删除的头结点,那么头结点就得重新定义
temp := head
helper := head
//空链表
if temp == nil {
fmt.Println("空的链表")
return head
}
//如果只有一个节点
if temp.next == head {
temp.next = nil
return head
}
//将helper定位到最后
for {
if helper.next == head {
break
}
helper = helper.next
}
//两个及以上的节点
flag := true //加这个是去判断下面的for是不是走了删除,我们默认的num是不重复的,所以这个变为了flase,出了for循环就不需要再删除,反之需要
for {
if temp.next == head { //如果这里退出的,说明到最后一个还是没找到符合id的,那就退出,但是temp并没有比较,所以退出循环后要比较最后一个
break
}
if temp.num == id {
//如果是头结点
if temp == head {
head = head.next
}
helper.next = temp.next //其实helper一直是temp的上一个节点
flag = false
break
}
temp = temp.next
helper = helper.next //temp在移动,helper也在移动,一直跟着后面的
}
if flag { //走了上面的for但没有删除,所以要比较最后一个节点的值是不是符合删除条件
if temp.num == id {
helper.next = temp.next
} else {
fmt.Println()
fmt.Println("没有你要删除的ID")
}
}
return head

}
func main() {

//var head *CatNode
//head = new(CatNode)
head := &CatNode{}
//创猫
Node1 := &CatNode{
num: 1,
name: "TOM1",
}
Node2 := &CatNode{
num: 2,
name: "TOM2",
}
Node3 := &CatNode{
num: 3,
name: "TOM3",
}
InsertCatNode(head, Node1)
InsertCatNode(head, Node2)
InsertCatNode(head, Node3)
ShowCatNode(head)
head = DelCatNode(head, 1) //记得一定要重新给head赋值,一旦是删除的头结点,head就不一样了
ShowCatNode(head)
}

go语言数据结构之-环形单链表

原文:https://www.cnblogs.com/quanp/p/15050149.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!