美文网首页
Go语言的列表list

Go语言的列表list

作者: 码二哥 | 来源:发表于2020-01-31 16:40 被阅读0次

    参考:
    http://c.biancheng.net/view/35.html

    关键点

    列表list内部是双链表

    列表能够高效地进行任意位置的元素插入删除操作

    可以通过newvar 进行声明列表

    列表的元素类型,没有限制

    list的使用场景

    各种类型的元素 组成时,可以使用列表list

    在Go语言中,列表使用 container/list 包来实现,内部的实现原理是双链表。

    1、初始化列表

    list 的初始化有两种方法:
    分别是使用

    • New() 函数
    • var 关键字声明,

    两种方法的初始化效果都是一致的。

    1. 通过 container/list 包的New() 函数初始化 list

    变量名 := list.New()

    1. 通过 var 关键字声明初始化 list

    var 变量名 list.List

    2、列表切片和 map不同的是,

    列表并没有具体元素类型限制,因此,列表的元素可以是任意类型,这既带来了便利,

    也引来一些问题,例如给列表中放入了一个 interface{} 类型的值,取出值后,

    如果要将 interface{} 转换为其他类型将会发生宕机

    3、在列表中插入元素

    双链表支持从队列前方或后方插入元素,分别对应的方法是

    • PushFront
    • PushBack。

    提示
    这两个方法都会返回一个 *list.Element 结构,如果在以后的使用中需要删除插入的元素,则只能通过 *list.Element 配合 Remove() 方法进行删除,这种方法可以让删除更加效率化,同时也是双链表特性之一。

    下面代码展示如何给 list

    l := list.New()
    l.PushBack("fist")
    l.PushFront(67)
    

    代码说明如下:

    • 第 1 行,创建一个列表实例。
    • 第 3 行,将 fist 字符串插入到列表的尾部,此时列表是空的,插入后只有一个元素。
    • 第 4 行,将数值 67 放入列表,此时,列表中已经存在 fist 元素,67 这个元素将被放在 fist 的前面。
    image

    4、从列表中删除元素

    列表插入函数的返回值会提供一个 *list.Element 结构,这个结构记录着列表元素的值以及与其他节点之间的关系等信息,从列表中删除元素时,需要用到这个结构进行快速删除。

    列表操作元素:

    package main
    import "container/list"
    func main() {
        l := list.New()
        // 尾部添加
        l.PushBack("canon")
        // 头部添加
        l.PushFront(67)
        // 尾部添加后保存元素句柄
        element := l.PushBack("fist")
        // 在fist之后添加high
        l.InsertAfter("high", element)
        // 在fist之前添加noon
        l.InsertBefore("noon", element)
        // 使用
        l.Remove(element)
    }
    

    代码说明如下:

    • 第 6 行,创建列表实例。
    • 第 9 行,将字符串 canon 插入到列表的尾部。
    • 第 12 行,将数值 67 添加到列表的头部。
    • 第 15 行,将字符串 fist 插入到列表的尾部,并将这个元素的内部结构保存到 element 变量中。
    • 第 18 行,使用 element 变量,在 element 的位置后面插入 high 字符串。
    • 第 21 行,使用 element 变量,在 element 的位置前面插入 noon 字符串。
    • 第 24 行,移除 element 变量对应的元素。

    下表中展示了每次操作后列表的实际元素情况。

    列表元素操作的过程

    5、遍历列表——访问列表的每一个元素

    遍历双链表需要配合 Front() 函数获取头元素,遍历时只要元素不为空就可以继续进行,每一次遍历都会调用元素的 Next() 函数,代码如下所示。

    l := list.New()
    // 尾部添加
    l.PushBack("canon")
    // 头部添加
    l.PushFront(67)
    for i := l.Front(); i != nil; i = i.Next() {
        fmt.Println(i.Value)
    }
    

    代码输出如下:

    67
    canon
    

    代码说明如下:

    • 第 1 行,创建一个列表实例。
    • 第 4 行,将 canon 放入列表尾部。
    • 第 7 行,在队列头部放入 67。
    • 第 9 行,使用 for 语句进行遍历,其中 i:=l.Front() 表示初始赋值,只会在一开始执行一次,每次循环会进行一次 i != nil 语句判断,如果返回 false,表示退出循环,反之则会执行 i = i.Next()。
    • 第 10 行,使用遍历返回的 *list.Element 的 Value 成员取得放入列表时的原值。

    相关文章

      网友评论

          本文标题:Go语言的列表list

          本文链接:https://www.haomeiwen.com/subject/uuwgthtx.html