数据结构之GO实现环形链表

环形链表原理如下图所示:

循环链表的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环

Go语言代码实现如下:

package main
import (
	"fmt"
)
//定义狗的结构体结点
type DogNode struct {
	no int //狗的编号
	name string
	next *DogNode
}

func InsertCatNode(head *DogNode, newCatNode *DogNode) {
	//判断是不是添加第一只狗
	if head.next == nil {
		head.no = newCatNode.no
		head.name = newCatNode.name
		head.next = head //构成一个环形
		fmt.Println(newCatNode, "加入到环形的链表")
		return
	}
	temp := head//定义一个临时变量,帮忙,找到环形的最后结点
	for {
		if temp.next == head {
			break
		}
		temp = temp.next
	}
	//加入到链表中
	temp.next = newCatNode
	newCatNode.next = head
}

//输出这个环形的链表
func ListCircleLink(head *DogNode) {
	fmt.Println("环形链表的情况如下:")
	temp := head
	if temp.next == nil {
		fmt.Println("空环形链表...")
		return
	}
	for {
		fmt.Printf("狗的信息为=[id=%d name=%s] ->\n", temp.no, temp.name)
		if temp.next == head {
			break
		}
		temp = temp.next
	}
}

//删除一只狗
func DelCatNode(head *DogNode, id int) *DogNode {

	temp := head
	helper := head
	//空链表
	if temp.next == nil {
		fmt.Println("这是一个空的环形链表,不能删除")
		return head
	}

	//如果只有一个结点
	if temp.next == head { //只有一个结点
		if temp.no == id {
			temp.next = nil
		}
		return head
	}

	//将helper 定位到链表最后
	for {
		if helper.next == head {
			break
		}
		helper = helper.next
	}
	//如果有两个包含两个以上结点
	flag := true
	for {
		if temp.next == head { //如果到这来,说明我比较到最后一个【最后一个还没比较】
			break
		}
		if temp.no ==id {
			if temp == head { //说明删除的是头结点
				head = head.next
			}
			//恭喜找到., 我们也可以在直接删除
			helper.next = temp.next
			fmt.Printf("狗狗=%d\n", id)
			flag = false
			break
		}
		temp = temp.next //移动 【比较】
		helper = helper.next //移动 【一旦找到要删除的结点 helper】
	}
	//这里还有比较一次
	if flag { //如果flag 为真,则我们上面没有删除
		if temp.no == id {
			helper.next = temp.next
			fmt.Printf("狗狗=%d\n", id)
		}else {
			fmt.Printf("对不起,没有no=%d\n", id)
		}
	}
	return head
}

func main() {

	//这里我们初始化一个环形链表的头结点
	head := &DogNode{}

	//创建一只狗
	dog1 := &DogNode{
		no : 1,
		name : "liu",
	}
	dog2 := &DogNode{
		no : 2,
		name : "liu2",
	}
	dog3 := &DogNode{
		no : 3,
		name : "liu3",
	}
	InsertCatNode(head, dog1)
	InsertCatNode(head, dog2)
	InsertCatNode(head, dog3)
	ListCircleLink(head)

	head = DelCatNode(head, 1)

	fmt.Println()
	fmt.Println()
	fmt.Println()
	ListCircleLink(head)
}

运行结果如下:
环形链表的情况如下:

狗的信息为=[id=2 name=liu2] 
狗的信息为=[id=3 name=liu3] 

猜你喜欢

转载自blog.csdn.net/weixin_43318506/article/details/106201558
今日推荐