# Linklist Linklist是链表数据结构,它的节点有一个值和一个指向下一个节点的指针。
## 源码 - [https://github.com/duke-git/lancet/blob/main/datastructure/link/singlylink.go](https://github.com/duke-git/lancet/blob/main/datastructure/link/singlylink.go) - [https://github.com/duke-git/lancet/blob/main/datastructure/link/doublylink.go](https://github.com/duke-git/lancet/blob/main/datastructure/link/doublylink.go) ## 用法 ```go import ( link "github.com/duke-git/lancet/v2/datastructure/link" ) ``` ## 目录 ### 1. SinglyLink单链表 - [NewSinglyLink](#NewSinglyLink) - [Values](#SinglyLink_Values) - [InsertAt](#SinglyLink_InsertAt) - [InsertAtHead](#SinglyLink_InsertAtHead) - [InsertAtTail](#SinglyLink_InsertAtTail) - [DeleteAt](#SinglyLink_DeleteAt) - [DeleteAtHead](#SinglyLink_DeleteAtHead) - [DeleteAtTail](#SinglyLink_DeleteAtTail) - [DeleteValue](#SinglyLink_DeleteValue) - [Reverse](#SinglyLink_Reverse) - [GetMiddleNode](#SinglyLink_GetMiddleNode) - [Size](#SinglyLink_Size) - [IsEmpty](#SinglyLink_IsEmpty) - [Clear](#SinglyLink_Clear) - [Print](#SinglyLink_Print) ### 2. DoublyLink双向链表 - [NewDoublyLink](#NewDoublyLink) - [Values](#DoublyLink_Values) - [InsertAt](#DoublyLink_InsertAt) - [InsertAtHead](#DoublyLink_InsertAtHead) - [InsertAtTail](#DoublyLink_InsertAtTail) - [DeleteAt](#DoublyLink_DeleteAt) - [DeleteAtHead](#DoublyLink_DeleteAtHead) - [DeleteAtTail](#DoublyLink_DeleteAtTail) - [Reverse](#DoublyLink_Reverse) - [GetMiddleNode](#DoublyLink_GetMiddleNode) - [Size](#DoublyLink_Size) - [IsEmpty](#DoublyLink_IsEmpty) - [Clear](#DoublyLink_Clear) - [Print](#DoublyLink_Print) ## 文档 ### 1. SinglyLink SingleLink是单向链表,它的节点有一个值和一个指向链表的下一个节点的指针。 ### NewSinglyLink创建SinglyLink指针实例
函数签名: ```go type LinkNode[T any] struct { Value T Next *LinkNode[T] } type SinglyLink[T any] struct { Head *datastructure.LinkNode[T] length int } func NewSinglyLink[T any]() *SinglyLink[T] ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewSinglyLink[int]() fmt.Println(lk) } ``` ### Values返回链表中所有节点值的切片
函数签名: ```go func (link *SinglyLink[T]) Values() []T ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewSinglyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) fmt.Println(lk.Values()) //[]int{1, 2, 3} } ``` ### InsertAt将值插入到索引处的链表中,索引应大于或等于0且小于或等于链表节点数
函数签名: ```go func (link *SinglyLink[T]) InsertAt(index int, value T) ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewSinglyLink[int]() lk.InsertAt(1, 1) //do nothing lk.InsertAt(0, 1) lk.InsertAt(1, 2) lk.InsertAt(2, 3) lk.InsertAt(2, 4) fmt.Println(lk.Values()) //[]int{1, 2, 4, 3} } ``` ### InsertAtHead将值插入到链表表头
函数签名: ```go func (link *SinglyLink[T]) InsertAtHead(value T) ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewSinglyLink[int]() lk.InsertAtHead(1) lk.InsertAtHead(2) lk.InsertAtHead(3) fmt.Println(lk.Values()) //[]int{3, 2, 1} } ``` ### InsertAtTail将值插入到链表末尾
函数签名: ```go func (link *SinglyLink[T]) InsertAtTail(value T) ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewSinglyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) fmt.Println(lk.Values()) //[]int{1, 2, 3} } ``` ### DeleteAt删除特定索引处的值,索引应大于或等于0且小于或等于链接节点数-1
函数签名: ```go func (link *SinglyLink[T]) DeleteAt(index int) ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewSinglyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) lk.InsertAtTail(4) lk.DeleteAt(3) fmt.Println(lk.Values()) //[]int{1, 2, 3} } ``` ### DeleteAtHead删除链表头节点
函数签名: ```go func (link *SinglyLink[T]) DeleteAtHead() ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewSinglyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) lk.InsertAtTail(4) lk.DeleteAtHead() fmt.Println(lk.Values()) //[]int{2, 3, 4} } ``` ### DeleteAtTail删除链表末尾节点
函数签名: ```go func (link *SinglyLink[T]) DeleteAtTail() ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewSinglyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) lk.DeleteAtTail() fmt.Println(lk.Values()) //[]int{1, 2} } ``` ### DeleteValue删除链表中指定的value值
函数签名: ```go func (link *SinglyLink[T]) DeleteValue(value T) ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewSinglyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(2) lk.InsertAtTail(3) lk.DeleteValue(2) fmt.Println(lk.Values()) //[]int{1, 3} } ``` ### Reverse反转链表所有节点顺序
函数签名: ```go func (link *SinglyLink[T]) Reverse() ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewSinglyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) lk.Reverse() fmt.Println(lk.Values()) //[]int{3, 2, 1} } ``` ### GetMiddleNode获取链表中部节点
函数签名: ```go func (link *SinglyLink[T]) GetMiddleNode() *datastructure.LinkNode[T] ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewSinglyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) midNode := lk.GetMiddleNode() fmt.Println(midNode.Value) //2 } ``` ### Size获取链表节点数量
函数签名: ```go func (link *SinglyLink[T]) Size() int ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewSinglyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) fmt.Println(lk.Size()) //3 } ``` ### IsEmpty判断链表是否为空
函数签名: ```go func (link *SinglyLink[T]) IsEmpty() bool ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewSinglyLink[int]() fmt.Println(lk.IsEmpty()) //true lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) fmt.Println(lk.IsEmpty()) //false } ``` ### Clear清空链表所有节点
函数签名: ```go func (link *SinglyLink[T]) Clear() ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewSinglyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) lk.Clear() fmt.Println(lk.Values()) // } ``` ### Print打印链表结构
函数签名: ```go func (link *SinglyLink[T]) Clear() ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewSinglyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) lk.Print() //[ &{Value:1 Pre:创建NewDoublyLink指针实例
函数签名: ```go type LinkNode[T any] struct { Value T Pre *LinkNode[T] Next *LinkNode[T] } type DoublyLink[T any] struct { Head *datastructure.LinkNode[T] length int } func NewDoublyLink[T any]() *DoublyLink[T] ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewDoublyLink[int]() fmt.Println(lk) } ``` ### Values返回链表中所有节点值的切片
函数签名: ```go func (link *DoublyLink[T]) Values() []T ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewDoublyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) fmt.Println(lk.Values()) //[]int{1, 2, 3} } ``` ### InsertAt将值插入到索引处的链表中,索引应大于或等于0且小于或等于链表节点数
函数签名: ```go func (link *DoublyLink[T]) InsertAt(index int, value T) ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewDoublyLink[int]() lk.InsertAt(1, 1) //do nothing lk.InsertAt(0, 1) lk.InsertAt(1, 2) lk.InsertAt(2, 3) lk.InsertAt(2, 4) fmt.Println(lk.Values()) //[]int{1, 2, 4, 3} } ``` ### InsertAtHead将值插入到链表表头
函数签名: ```go func (link *DoublyLink[T]) InsertAtHead(value T) ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewDoublyLink[int]() lk.InsertAtHead(1) lk.InsertAtHead(2) lk.InsertAtHead(3) fmt.Println(lk.Values()) //[]int{3, 2, 1} } ``` ### InsertAtTail将值插入到链表末尾
函数签名: ```go func (link *DoublyLink[T]) InsertAtTail(value T) ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewDoublyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) fmt.Println(lk.Values()) //[]int{1, 2, 3} } ``` ### DeleteAt删除特定索引处的值,索引应大于或等于0且小于或等于链接节点数-1
函数签名: ```go func (link *DoublyLink[T]) DeleteAt(index int) ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewDoublyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) lk.InsertAtTail(4) lk.DeleteAt(3) fmt.Println(lk.Values()) //[]int{1, 2, 3} } ``` ### DeleteAtHead删除链表头节点
函数签名: ```go func (link *DoublyLink[T]) DeleteAtHead() ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewDoublyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) lk.InsertAtTail(4) lk.DeleteAtHead() fmt.Println(lk.Values()) //[]int{2, 3, 4} } ``` ### DeleteAtTail删除链表末尾节点
函数签名: ```go func (link *DoublyLink[T]) DeleteAtTail() ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewDoublyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) lk.DeleteAtTail() fmt.Println(lk.Values()) //[]int{1, 2} } ``` ### Reverse反转链表所有节点顺序
函数签名: ```go func (link *DoublyLink[T]) Reverse() ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewDoublyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) lk.Reverse() fmt.Println(lk.Values()) //[]int{3, 2, 1} } ``` ### GetMiddleNode获取链表中部节点
函数签名: ```go func (link *DoublyLink[T]) GetMiddleNode() *datastructure.LinkNode[T] ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewDoublyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) midNode := lk.GetMiddleNode() fmt.Println(midNode.Value) //2 } ``` ### Size获取链表节点数量
函数签名: ```go func (link *DoublyLink[T]) Size() int ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewDoublyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) fmt.Println(lk.Size()) //3 } ``` ### IsEmpty判断链表是否为空
函数签名: ```go func (link *DoublyLink[T]) IsEmpty() bool ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewDoublyLink[int]() fmt.Println(lk.IsEmpty()) //true lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) fmt.Println(lk.IsEmpty()) //false } ``` ### Clear清空链表所有节点
函数签名: ```go func (link *DoublyLink[T]) Clear() ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewDoublyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) lk.Clear() fmt.Println(lk.Values()) // } ``` ### Print打印链表结构
函数签名: ```go func (link *DoublyLink[T]) Clear() ``` 示例: ```go package main import ( "fmt" link "github.com/duke-git/lancet/v2/datastructure/link" ) func main() { lk := link.NewDoublyLink[int]() lk.InsertAtTail(1) lk.InsertAtTail(2) lk.InsertAtTail(3) lk.Print() // } ```