1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-04 21:02:27 +08:00
Files
lancet/docs/api/packages/datastructure/link.md
2023-08-25 11:05:33 +08:00

16 KiB
Raw Blame History

Linklist

Linklist是链表数据结构它的节点有一个值和一个指向下一个节点的指针。

源码

用法

import (
    link "github.com/duke-git/lancet/v2/datastructure/link"
)

目录

1. SinglyLink单链表

2. DoublyLink双向链表

文档

SingleLink是单向链表它的节点有一个值和一个指向链表的下一个节点的指针。

NewSinglyLink

创建SinglyLink指针实例

函数签名:

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]

示例:

package main

import (
    "fmt"
    link "github.com/duke-git/lancet/v2/datastructure/link"
)

func main() {
    lk := link.NewSinglyLink[int]()
    fmt.Println(lk)
}

返回链表中所有节点值的切片

函数签名:

func (link *SinglyLink[T]) Values() []T

示例:

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}
}

将值插入到索引处的链表中索引应大于或等于0且小于或等于链表节点数

函数签名:

func (link *SinglyLink[T]) InsertAt(index int, value T)

示例:

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}
}

将值插入到链表表头

函数签名:

func (link *SinglyLink[T]) InsertAtHead(value T)

示例:

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}
}

将值插入到链表末尾

函数签名:

func (link *SinglyLink[T]) InsertAtTail(value T)

示例:

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}
}

删除特定索引处的值索引应大于或等于0且小于或等于链接节点数-1

函数签名:

func (link *SinglyLink[T]) DeleteAt(index int)

示例:

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}
}

删除链表头节点

函数签名:

func (link *SinglyLink[T]) DeleteAtHead()

示例:

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}
}

删除链表末尾节点

函数签名:

func (link *SinglyLink[T]) DeleteAtTail()

示例:

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}
}

删除链表中指定的value值

函数签名:

func (link *SinglyLink[T]) DeleteValue(value T)

示例:

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}
}

反转链表所有节点顺序

函数签名:

func (link *SinglyLink[T]) Reverse()

示例:

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}
}

获取链表中部节点

函数签名:

func (link *SinglyLink[T]) GetMiddleNode() *datastructure.LinkNode[T]

示例:

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
}

获取链表节点数量

函数签名:

func (link *SinglyLink[T]) Size() int

示例:

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
}

判断链表是否为空

函数签名:

func (link *SinglyLink[T]) IsEmpty() bool

示例:

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
}

清空链表所有节点

函数签名:

func (link *SinglyLink[T]) Clear()

示例:

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()) //
}

打印链表结构

函数签名:

func (link *SinglyLink[T]) Clear()

示例:

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:<nil> Next:0xc0000a4048}, &{Value:2 Pre:<nil> Next:0xc0000a4060}, &{Value:3 Pre:<nil> Next:<nil>} ]
}

DoublyLink是双向链表它的节点有一个值next指针指向下一个节点pre指针指向前一个节点。

NewDoublyLink

创建NewDoublyLink指针实例

函数签名:

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]

示例:

package main

import (
    "fmt"
    link "github.com/duke-git/lancet/v2/datastructure/link"
)

func main() {
    lk := link.NewDoublyLink[int]()
    fmt.Println(lk)
}

返回链表中所有节点值的切片

函数签名:

func (link *DoublyLink[T]) Values() []T

示例:

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}
}

将值插入到索引处的链表中索引应大于或等于0且小于或等于链表节点数

函数签名:

func (link *DoublyLink[T]) InsertAt(index int, value T)

示例:

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}
}

将值插入到链表表头

函数签名:

func (link *DoublyLink[T]) InsertAtHead(value T)

示例:

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}
}

将值插入到链表末尾

函数签名:

func (link *DoublyLink[T]) InsertAtTail(value T)

示例:

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}
}

删除特定索引处的值索引应大于或等于0且小于或等于链接节点数-1

函数签名:

func (link *DoublyLink[T]) DeleteAt(index int)

示例:

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}
}

删除链表头节点

函数签名:

func (link *DoublyLink[T]) DeleteAtHead()

示例:

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}
}

删除链表末尾节点

函数签名:

func (link *DoublyLink[T]) DeleteAtTail()

示例:

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}
}

反转链表所有节点顺序

函数签名:

func (link *DoublyLink[T]) Reverse()

示例:

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}
}

获取链表中部节点

函数签名:

func (link *DoublyLink[T]) GetMiddleNode() *datastructure.LinkNode[T]

示例:

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
}

获取链表节点数量

函数签名:

func (link *DoublyLink[T]) Size() int

示例:

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
}

判断链表是否为空

函数签名:

func (link *DoublyLink[T]) IsEmpty() bool

示例:

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
}

清空链表所有节点

函数签名:

func (link *DoublyLink[T]) Clear()

示例:

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()) //
}

打印链表结构

函数签名:

func (link *DoublyLink[T]) Clear()

示例:

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() //
}