📌算法Go语言描述📌datastruct📌2_linked_list.go
package datastruct
import (
"container/list"
"container/ring"
"fmt"
)
// 最简单的单向链表
type ListNode struct {
Val any
Next *ListNode
}
func NewLinkedList(val ...any) *ListNode {
dummy := &ListNode{}
cur := dummy
for _, v := range val {
cur.Next = &ListNode{Val: v}
cur = cur.Next
}
return dummy.Next
}
func (list *ListNode) Print() {
for cur := list; cur != nil; cur = cur.Next {
fmt.Print(cur.Val, "->")
}
fmt.Println("nil")
}
// "container/list"包实现了一个双向链表
func ExampleList() {
l := list.New() // 创建一个链表
a := l.PushBack("A") // 链表尾插入新元素
b := l.PushFront("B") // 链表头插入新元素
l.InsertBefore("C", a) // 节点前插入元素
l.InsertAfter("D", b) // 节点后插入元素
fmt.Println(l.Len(), l.Front().Value, l.Back().Value) // 4 B A
for e := l.Front(); e != nil; e = e.Next() { // 顺序遍历
fmt.Print(e.Value, " ") // B D C A
}
fmt.Println()
val := l.Remove(a) // 删除一个元素
fmt.Println(l.Len(), val) // 3 A
for e := l.Back(); e != nil; e = e.Prev() { //逆序遍历
fmt.Print(e.Value, " ") // C D B
}
fmt.Println()
}
// "container/ring"包实现了一个双向环链表
func ExampleRing() {
r := ring.New(6)
for i := 0; i < r.Len(); i++ {
r.Value = i
r = r.Next() // 顺向移动
}
for j := 0; j < r.Len(); j++ {
r = r.Prev() // 逆向移动
fmt.Print(r.Value, " ") // 5 4 3 2 1 0
}
fmt.Println()
r = r.Move(2) // 大于0顺向移动,小于0逆向移动
r.Do(func(i any) {
fmt.Print(i, " ") // 2 3 4 5 0 1
})
fmt.Println()
}
// Golang中还能使用带缓冲的channel实现单向有锁队列。