环形链表
概念
是单向链表的特例。将单向链表的尾结点,指向第一个数据结点(不是头结点)
循环链表数据结点
type LinkNode struct {
Data interface{}
Next *LinkNode
}
循环链表的方法
1. 创建链表 Create(数据)
2. 打印链表 Print()
3. 获取结点个数 Length() int
4. 插入结点 Insert(index, 数据)
5. 删除结点 Delete(index)
6. 销毁链表 Destroy()
go实现
创建循环链表:
1. 容错
2. 将 node 的值保存成 head 。 以便创建结束时,恢复node值。
3. 根据参数 Data 遍历创建 数据结点
1. new 一个 数据结点,并且依次初始化。
2. 将当前结点的下一结点赋值为新结点 : node.Next = newNode
3. 更新新结点为当前结点:node = node.Next
4. 将尾结点的 Next 指向 第一个数据结点。形成逻辑的环形链表 node.Next = head.Next
5. 使用之前保存的 head, 恢复node值。 node = head
打印循环链表:
1. 容错
2. 定义标记位置,保存第一个数据结点 start := node.Next
3. 无条件循环, 依次读取所有结点的 数据域
1. 数据域不为空打印
2. 判断,当 结点 的 Next 为 start 的时候 (尾结点)。跳出当前循环。
// 打印环形链表 Print
func (node *LinkNode) Print() {
if node == nil {
return
}
// 创建一个标记位置
start := node.Next // 第一个数据结点
for {
node = node.Next
if node.Data != nil {
fmt.Print(node.Data, " ")
}
if start == node.Next {
break
}
}
}