zoukankan      html  css  js  c++  java
  • 从零开始学Go之容器(四):列表

    链表内部的实现原理是双链表,可以高效地进行任意位置的元素插入和删除操作

    类似的还有堆heap和环列表ring,声明和初始化的方式是相同的,只是原理以及操作的函数不同,当理解了原理操作也是很简单的。

    声明与初始化:

    list 的初始化有两种方法:New 和声明。两种方法的初始化效果都是一致的。

    变量名 := list.New()

    var 变量名 list.List

    //通过 container/list 包的 New 方法初始化 list
    a := list.New()
    //通过声明初始化list
    var v list.List

     

    插入元素:

    头部插入:PushFront(值)

    尾部插入:PushBack(值)

    标记点前插入:InsertBefore(值, 标记点)

    标记点后插入:InsertAfter(值, 标记点)

    标记点是一个指针,通过其他函数(例如Front(),Back(),插入时的返回值等)获取

     l := list.New()
     // 尾部添加
     l.PushBack("fist")
     // 尾部添加
     l.PushBack("canon")
     // 头部添加
     l.PushFront(67)
     // 尾部添加后保存元素句柄
     element := l.PushBack("fist")
     // 修改元素句柄为67
     element = l.Front()
     // 在fist之前添加noon
     l.InsertBefore("noon", element)
     // 在fist之后添加high
     l.InsertAfter("high", element)

     

    删除元素:

    Remove(标记点)

    func main() {
     l := list.New()
     // 尾部添加
     l.PushBack("fist")
     // 尾部添加
     l.PushBack("canon")
     // 头部添加
     l.PushFront(67)
     // 尾部添加后保存元素句柄
     element := l.PushBack("fist")
     // 修改元素句柄为67
     element = l.Front()
     // 在fist之前添加noon
     l.InsertBefore("noon", element)
     // 在fist之后添加high
     l.InsertAfter("high", element)
     // 删除67
     l.Remove(element)
    }

     

    列表遍历:

    通过Front()和Back()可以获取列表的头和尾的指针

    func main() {
     l := list.New()
     l.PushBack("canon")
     l.PushFront(67)
     for i := l.Front(); i != nil; i = i.Next() {
      fmt.Println(i.Value)
     }
    }

    运行结果

    67

    canon

  • 相关阅读:
    Atitit 图像金字塔原理与概率 attilax的理解总结qb23
    Atitit.软件中见算法 程序设计五大种类算法
    百度之星
    linux下编程IDE环境
    c++多态的实现 VC++消息映射的实现
    static_cast, const_cast,dynamic_cast和reinterpret_cast
    X Window研究笔记(1)~22
    关于串口发送短信
    模式识别中的核方法
    IC设计,verilog学习链接
  • 原文地址:https://www.cnblogs.com/VingB2by/p/11087327.html