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)
}

输出演示:
GO单向环形循环链表-LMLPHP

08-29 15:15