研究计划:分享下最近使用golang模拟的链表数据结构

首先,我们知道链表的特性,分别有单线链表双线链表,下面我用golang来模拟了一个单线链表

链表的添加,他其实分别是有头部插入法尾部插入法的,我在代码中都写了这两个方法

结构体 Student 是必须要有一个指针,这个指针是指向下一个链表的,当然,如果是双向链表的话,这里还需要记录一个头部指针,也就是说这个结构体会有两个指针

type Student struct {
    Name  string
    Age   int
    Score float32
    next  *Student
}

 

一个小细节:在插入某一个节点,比如 a b c 三个节点,我需要插入一个d 在 a 和 b 之间,这时候遍历到b 之后再进行插入,不然你如果在a的时候就开始进行插入操作,那么你是获取不到b节点的尾部的

 

双向链表

 

 

完整的代码:

package main

import (
    "fmt"
    "math/rand"
)

/*
    链表的结构
*/
type Student struct {
    Name  string
    Age   int
    Score float32
    next  *Student
}

/*
    尾部插入法
*/
func insertTail(p *Student) {
    var tail = p // 初始化节点
    for i := 0; i < 10; i++ {
        stu := Student{
            Name:  fmt.Sprintf("stu%d", i),
            Age:   rand.Intn(100),
            Score: rand.Float32() * 100,
        }
        tail.next = &stu
        tail = &stu // 需要把tail弄到新的节点重新初始化
    }
}
/*
    遍历链表
*/
func trans(p *Student) {
    for p != nil {
        fmt.Println(*p)
        p = p.next
    }
}

/*
    头部插入法
*/
func insertHead(p **Student) {

    for i := 0; i < 10; i++ {
        stu := Student{
            Name:  fmt.Sprintf("stu%d", i),
            Age:   rand.Intn(100),
            Score: rand.Float32() * 100,
        }
        stu.next = *p
        *p = &stu
    }
}

/*
    删除节点 这里会有个问题,就是头节点不能删除
*/
func delNode(p *Student) {
    var prev *Student = p // 这个是临时变量,保存上一个节点
    for p != nil {
        if p.Name == "stu6" {
            prev.next = p.next // 上一个节点就等于下一个节点
            break
        }
        prev = p // 这个是记录每次循环中的自己
        p = p.next
    }
}

/*
    在指定节点插入一个节点
*/
func addNode(p *Student, newNode *Student) {

    for p != nil {
        if p.Name == "stu5" {
            newNode.next = p.next //新节点的next等于当前节点的next
            p.next = newNode      // 当前节点的next等于新节点的结构体
            break
        }
        p = p.next
    }
}

func main() {
    var head *Student = new(Student) // 头节点
    head.Age = 18
    head.Score = 99
    head.Name = "asdsad"
    insertHead(&head) // 添加一些节点 循环去添加吧,模拟
    delNode(&head) // 删除某一个链表

    var newNode *Student = new(Student) // 插入一个节点
    newNode.Age = 18
    newNode.Score = 99
    newNode.Name = "stu1000"
    addNode(head, newNode) // 插入节点

    trans(head) // 遍历
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Golang 提供了一些底层数据结构,这些数据结构可以用于构建高效的程序。以下是一些常见的底层数据结构: 1. 数组(Arrays):在 Golang 中,数组是固定长度的数据结构,可以存储相同类型的元素。数组使用索引访问元素,具有快速的随机访问能力。 2. 切片(Slices):切片是一个动态长度的数组,可以根据需要进行扩展或收缩。切片是基于数组实现的,提供了更灵活的操作和更方便的使用。 3. 映射(Maps):映射是一种无序的键值对集合。它类似于字典或哈希表,通过键来访问值。Golang 的映射使用哈希表来实现,具有快速的查找和入能力。 4. 链表(Linked Lists):链表是一种基本的数据结构,它由多个节点组成,每个节点包含一个值和一个指向下一个节点的指针。链表可以用于实现队列、栈和其他高级数据结构。 5. 栈(Stacks):栈是一种后进先出(LIFO)的数据结构,只能在栈顶进行入和删除操作。Golang 中可以使用切片或链表实现栈。 6. 队列(Queues):队列是一种先进先出(FIFO)的数据结构,只能在队尾进行入操作,在队头进行删除操作。Golang 中可以使用切片或链表实现队列。 7. 堆(Heaps):堆是一种特殊的二叉树,具有一些特定的性质。在 Golang 中,可以使用堆接口和堆包来实现最小堆或最大堆。 8. 树(Trees):树是一种非线性数据结构,由节点和边组成。树在计算机科学中有广泛的应用,如二叉树、AVL 树、红黑树等。 这些底层数据结构可以帮助开发者构建高效的程序,并在不同的应用场景中发挥作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值