单向环形链表
单向环形链表是一种特殊的单向链表。
单向链表最后一个节点的 Next 指针指向空。
而单向环形链表最后一个节点的 Next 指针指向头节点。
如图所示:
单向环形链表节点的构建
假设把几只猫的信息(编号、名字)构成一个单向环形链表。
Golang 代码:
type CatNode struct {
no int // 猫的编号
name string // 猫的名字
next *CatNode // 指向下一只猫的指针
}
往单向环形链表中插入节点
不按照编号顺序,新节点直接插入尾部。
Golang 代码:
// 无序地往单向环形链表添加节点
func InsertCircleNode(head *CatNode, newNode *CatNode) {
// 判断进来的新节点,是不是第一个节点
// 由于单向环形链表没有 head 节点
// 因此默认第一个进来的节点为头节点
if head.next == nil {
head.no = newNode.no
head.name = newNode.name
head.next = head
return
}
// 进来的新节点,不是第一个节点
temp := head
// 寻找最后一个节点
for temp.next != head {
temp = temp.next
}
newNode.next = head
temp.next = newNode
}
按照编号,有序地往单向环形链表中插入节点
Golang 代码:
// 按照编号, 有序地往单向环形链表中加入节点
func InsertCircleNodeByOrder(head *CatNode, newNode *CatNode) *CatNode {
// 辅助节点
temp := head
// 辅助指针,永远指向单向环形队列的尾部
tail := head
// 新节点进来时,单向环形链表为空
// 则让第一个节点为头节点,构成自循环
if head.next == nil {
head.name = newNode.name
head.no = newNode.no
head.next = head
return head
}
// 新节点进来时,单向环形链表中只有一个自循环的节点
if temp.next == head {
head.next = newNode
newNode.next = head
// 比较 newNode 和头节点的id大小
// 如果新节点的id较小,则称为头节点
if newNode.no < temp.no {
head = newNode
}
} else { // 单向环形链表有两个及以上的节点
// 让 tail 指向尾部节点
for tail.next != head {
tail = tail.next
}
// 如果新节点的 no 小于头节点
// 让新节点成为头节点
if head.no > newNode.no {
newNode.next = head
ta