使用Go编写一个LinkTable库

ValorUBK 2022-04-06 17:41:48

1、数据结构的定义

type ListNode struct {
    prev  *ListNode
    next  *ListNode
    value string
}

type List struct {
    head *ListNode
    tail *ListNode
    len int
}

2、节点操作的函数

// 创建一个节点
func NewListNode(value string) (listNode *ListNode) {
    listNode = &ListNode{
        value: value,
    }
    return
}

// 当前节点的前一个节点
func (n *ListNode) Prev() (prev *ListNode) {
    prev = n.prev
    return
}

// 当前节点的前一个节点
func (n *ListNode) Next() (next *ListNode) {
    next = n.next
    return
}

// 获取节点的值
func (n *ListNode) GetValue() (value string) {
    if n == nil {
        return
    }
    value = n.value
    return
}

3、链表操作的一系列函数

3.1 创建一个空链表

// 创建一个空链表
func NewList() (list *List) {
    list = &List{
    }
    return
}

3.2 返回链表的头/尾节点

// 返回链表头节点
func (l *List) Head() (head *ListNode) {
    head = l.head

    return
}

// 返回链表尾节点
func (l *List) Tail() (tail *ListNode) {
    tail = l.tail

    return
}

3.3 获取链表的长度

// 返回链表长度
func (l *List) Len() (len int) {
    len = l.len

    return
}

3.4 通过索引查找节点

// 通过索引查找节点
func (l *List) Index(index int) (node *ListNode) {
    
    if index < 0 {
        index = (-index) - 1
        node = l.tail
        for true {
            // 未找到
            if node == nil {
                return
            }

            
            if index == 0 {
                return
            }

            node = node.prev
            index--
        }
    } else {
        node = l.head
        for ; index > 0 && node != nil; index-- {
            node = node.next
        }
    }

    return
}

3.5 在链表的右边插入一个元素

func (l *List) RPush(value string) {

    node := NewListNode(value)

    // 链表未空的时候
    if l.Len() == 0 {
        l.head = node
        l.tail = node
    } else {
        tail := l.tail
        tail.next = node
        node.prev = tail

        l.tail = node
    }

    l.len = l.len + 1

    return
}

3.6 从链表的左边取出第一个节点

func (l *List) LPop() (node *ListNode) {
    if l.len == 0 {
        return
    }

    node = l.head

    if node.next == nil {
        l.head = nil
        l.tail = nil
    } else {
        l.head = node.next
    }
    l.len = l.len - 1

    return
}

LinkTable库上传至Gitee仓库:Gitee

517

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

571

社区成员

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

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