Go 实现 LinkTable 基本操作

yeying315 2022-07-10 14:33:11

1 创建基础结构体

type LinkTableNode struct {
    data interface{}
    next *LinkTableNode
}

type LinkTable struct {
    head *LinkTableNode
    tail *LinkTableNode
    size int
}

2 创建链表

func CreateLinkTable() *LinkTable {
    head := &LinkTableNode{}
    tail := head

    return &LinkTable{head, tail, 0}
}

3 获取链表信息

func (lt *LinkTable) GetHead() *LinkTableNode {
    return lt.head
}

func (lt *LinkTable) GetTail() *LinkTableNode {
    return lt.tail
}

func (lt *LinkTable) GetSize() int {
    return lt.size
}

4 更新链表相关操作

4.1 头插法

func (lt *LinkTable) InsertFromHead(data interface{}) bool {
    node := &LinkTableNode{}
    node.data = data

    head := lt.GetHead()
    tail := lt.GetTail()

    if head == nil {
        return false
    }
    if tail == head {
        lt.tail = node
    }

    temp := head.next
    head.next = node
    node.next = temp
    lt.size++

    return true
}

4.2 尾插法

func (lt *LinkTable) InsertFromTail(data interface{}) bool {
    node := &LinkTableNode{}
    node.data = data

    tail := lt.GetTail()
    tail.next = node
    lt.tail = node
    node.next = nil
    lt.size++

    return true
}

4.3 删除节点

func (lt *LinkTable) DeleteNoe(index int) bool {
    node := lt.FindNode(index)

    if node == lt.GetHead() || node == nil {
        return false
    }

    pre := lt.FindNode(index - 1)
    pre.next = node.next
    lt.size--

    return true
}

func (lt *LinkTable) PrintLinkTable() {
    curNode := lt.GetHead()

    for curNode != nil {
        fmt.Printf("%v ", curNode.data)
        curNode = curNode.next
    }

    fmt.Printf("\n")
}

5 查询节点

func (lt *LinkTable) FindNode(index int) *LinkTableNode {
    if index < 0 || index > lt.size {
        return nil
    }

    cur := 0
    curNode := lt.GetHead()

    for curNode != nil {
        if cur == index {
            return curNode
        }

        curNode = curNode.next
        cur++
    }

    return curNode
}

6 测试

func main() {
    lt := CreateLinkTable()

    lt.InsertFromHead(1)
    lt.InsertFromHead(2)
    lt.PrintLinkTable()
    lt.InsertFromTail(3)
    lt.PrintLinkTable()
    lt.DeleteNoe(2)
    lt.PrintLinkTable()
    fmt.Println("Head:", lt.GetHead().data, "Tail:", lt.GetTail().data, "Size:", lt.GetSize())
}

输出如下:

img

上传至 Gitee 仓库

img


img

作者:297

...全文
111 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

571

社区成员

发帖
与我相关
我的任务
社区描述
软件工程教学新范式,强化专项技能训练+基于项目的学习PBL。Git仓库:https://gitee.com/mengning997/se
软件工程 高校
社区管理员
  • 码农孟宁
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧