GO单向环形循环链表
// 单向环形链表 结构体 韩磊 201916010619
package main
import (
"fmt"
)
type CatNode struct {//定义猫的结构体结点
no int //猫猫的编号
name string
id int //加入链表的编号
next *CatNode
}
//全局 环形链表 初始元素 桥梁元素
var first = &CatNode{}
var t = &CatNode{}
var i = 0 //链表元素总数
func InsertCatNodeEnd(newCatNode *CatNode) {// 添加到链尾
i++
newCatNode.id = i //加入编号
if i == 1 { //第一个链表元素,自己指向自己
newCatNode.next = newCatNode
first = newCatNode //记住 第一个元素 地址
} else {
newCatNode.next = first//指向第一个元素地址
t.next = newCatNode //上一个新元素指向新元素
}
//构成一个环形
t = newCatNode //刷新元素
fmt.Println(newCatNode, "加入到环形的链表")
return
}
//输出环形链表 从this这个元素开始
func ListCircleLink(this *CatNode) {
fmt.Println("环形链表的情况如下:")
if this.next == nil {
fmt.Println("空的环形链表...")
return
}
t1 := this //验证是否走了一圈
for {
fmt.Printf("猫的信息为=[id=%d no=%d name=%s] ->\n",this.id,
this.no, this.name)
if t1 == this.next {//循环一圈
break
}
this = this.next
}
}
//删除一只猫 this所在的环形链表 删除this元素
func DelCatNode(this *CatNode) {
//空链表
if this.next == nil {
fmt.Println("这还不是环形链表,不能删除")
return
}
fmt.Println("删除链表元素 this ", this)
//如果只有一个结点
if this.next == this { //只有一个结点
this.next = nil
this.id = 0
return
}
t2 := this
for {
t2 = t2.next //t2向下迭代
if t2.id > this.id { //链表元素this之后的系统加入编号减一
t2.id--
}
// fmt.Println("链表元素 t2 ", t2) // 起调试检验
if t2.next == this { //t2循环到this之前,跳出
break
}
}
t2.next = this.next //this的前一个元素指向其后一个元素
//fmt.Println("链表元素 t2 ", t2)
//fmt.Println("链表元素 this ", this)
this.next = nil //将this元素指向空
return
}
func main() {
cat1 := &CatNode{
no : 1,
name : "tom",
}
cat2 := &CatNode{
no : 2,
name : "tom2",
}
cat3 := &CatNode{
no : 3,
name : "tom3",
}
InsertCatNodeEnd(cat1)
InsertCatNodeEnd(cat2)
InsertCatNodeEnd(cat3)
ListCircleLink(cat1)
fmt.Println(cat1,cat2,cat3)
DelCatNode(cat2)
fmt.Println()
ListCircleLink(cat2)
fmt.Println(cat2)
ListCircleLink(cat3)
}
输出演示: