使用Go语言实现一个LinkTable

FORX 2022-04-17 21:12:35

首先创建基础结构体:

type LinkTableNode struct {
    pNext *LinkTableNode
    v     interface{}
}

type LinkTable struct {
    pHead *LinkTableNode
    pTail *LinkTableNode
    size  int
}

然后我们创建相应的方法,分别是:

  1. 创建新链表

    func CreateLinkTable() *LinkTable {
     var head = new(LinkTableNode)
     head.pNext = nil
    
     return &LinkTable{head, nil, 0}
    }
    
  2. 获得和设置链表的基础属性


func (lt *LinkTable) getHead() *LinkTableNode {
    return lt.pHead
}

func (lt *LinkTable) getTail() *LinkTableNode {
    return lt.pTail
}

func (lt *LinkTable) setTail(n *LinkTableNode) bool {
    lt.pTail = n
    return true
}

func (lt *LinkTable) addSize(num int) {
    lt.size += num
}

func (lt *LinkTable) subSize(num int) {
    lt.size -= num
}

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

3.头插法和尾插法插入节点

func (lt *LinkTable) InsertFromHead(v interface{}) bool {
    var node = new(LinkTableNode)
    node.v = v
    var head = lt.getHead()
    if head == nil {
        return false
    }
    var t = head.pNext
    head.pNext = node
    node.pNext = t
    var tail = lt.getTail()
    if tail == nil {
        lt.setTail(node)
    }
    lt.addSize(1)
    return true
}

func (lt *LinkTable) InsertFromTail(v interface{}) bool {
    var tail = lt.getTail()
    if tail == nil {
        return lt.InsertFromHead(v)
    }
    var node = new(LinkTableNode)
    node.v = v
    node.pNext = nil

    tail.pNext = node

    tail = tail.pNext

    lt.setTail(tail)
    lt.addSize(1)
    return true
}

4.查找节点

func (lt *LinkTable) FindNode(v interface{}) (*LinkTableNode, int) {
    p := lt.getHead()
    var index = 1
    for p.pNext != nil {
        if p.pNext.v == v {
            return p.pNext, index
        }
        index++
        p = p.pNext
    }
    return nil, -1
}

func (lt *LinkTable) FindKthNode(k int) *LinkTableNode {
    if k > lt.GetSize() || k < 0 {
        return nil
    }
    if k == 0 {
        return lt.getHead()
    }

    p := lt.getHead()
    i := 1

    for i != k {
        i++
        p = p.pNext
    }
    return p.pNext
}

5.删除指定节点

func (lt *LinkTable) DeleteKthNode(k int) bool {
    if k <= 0 || k > lt.GetSize() {
        return false
    }
    var node = lt.FindKthNode(k)
    var parent = lt.FindKthNode(k - 1)
    parent.pNext = node.pNext
    lt.subSize(1)
    return true
}

至此一个链表的基础算法设计完成

然后使用以下命令将代码推送到gitee上

img

学号:346

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

571

社区成员

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

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