Go数据结构之单链表

有个同事,之前一直写弱类型语言,连链表结构都不知道。。。。下面是gpt解释


链表是一种常见的数据结构,用于存储一系列元素。与数组不同,链表中的元素在内存中不是连续存放的,而是通过每个元素(称为节点)中的指针(或引用)连接起来。链表的结构具有以下特点:

节点:链表由一系列节点组成,每个节点通常包含两部分,一部分用于存储数据,另一部分是一个或多个指针,用于指向列表中的下一个或前一个节点。

指针:节点中的指针用于连接链表中的元素,使其形成一个序列。在最简单的单向链表中,每个节点只包含一个指向下一个节点的指针。

头指针:链表通常有一个头指针,它指向链表的第一个节点,通过这个头指针可以访问整个链表。

尾指针:在某些链表实现中,可能会有一个尾指针指向链表的最后一个节点,但这不是必须的。

空链表:一个空链表不包含任何节点,其头指针通常为null。

动态大小:链表的大小可以在运行时动态变化,不需要像数组那样预先分配固定大小的存储空间。

插入和删除操作:在链表中插入或删除节点通常比数组更高效,因为这些操作只涉及到指针的修改,而不需要移动其他元素。

类型:链表有多种类型,包括单向链表、双向链表、循环链表等。

遍历:访问链表中的元素通常需要从头指针开始,然后通过节点间的指针逐个遍历。

内存使用:由于每个节点都需要额外的存储空间来存储指针,链表相比于数组可能会使用更多的内存。

链表是一种基础且强大的数据结构,适用于实现栈、队列、符号表等更高级的数据结构。它们在计算机科学和编程中有着广泛的应用。

代码,增删改查

package main

import (
    "fmt"
)

type Elem int

type LinkNode struct {
    Data Elem
    Next *LinkNode
}

//生成头节点
func New() *LinkNode {
    //下面的data可以用来表示链表的长度
    return &LinkNode{0, nil}
}

//在链表的第i个位置前插入一个元素e,复杂度为o(n)
func (head *LinkNode) Insert(i int, e Elem) bool {
    p := head
    j := 1
    for nil != p && j < i {
        p = p.Next
        j++
    }
    if nil == p || j > i {
        fmt.Println("pls check i:", i)
        return false
    }
    s := &LinkNode{Data: e}
    s.Next = p.Next
    p.Next = s
    return true
}

//遍历链表
func (head *LinkNode) Traverse() {
    point := head.Next
    for nil != point {
        fmt.Println(point.Data)
        point = point.Next
    }
    fmt.Println("--------done----------")
}

//删除链表中第i个节点,复杂度为o(n)
func (head *LinkNode) Delete(i int) bool  {
    p := head
    j := 1
    for (nil != p && j < i) {
        p = p.Next
        j++
    }
    if nil == p || j > i {
        fmt.Println("pls check i:", i)
        return false
    }

    p.Next = p.Next.Next
    return true
}

// 获取链表中的第i个元素,复杂度为o(n)
func (head *LinkNode) Get(i int) Elem  {
    p := head.Next
    for j:= 1; j< i ;j++  {
        if nil == p {
            //表示返回错误
            return -100001
        }
        p=p.Next
    }

    return p.Data
}

func main() {
    linkedList := New()
    linkedList.Insert(1, 9)
    linkedList.Insert(1, 99)
    linkedList.Insert(1, 999)
    linkedList.Insert(1, 9999)
    linkedList.Insert(1, 99999)
    linkedList.Insert(1, 999999)
    linkedList.Traverse()

    linkedList.Delete(4)
    linkedList.Traverse()

    e := linkedList.Get(4)
    fmt.Println(e)
}
posted @   朝阳1  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示