当前位置: 首页 > news >正文

Go标准容器之List

简介
Go的标准包container中包含了常用的容器类型,包括conatiner/list,container/heap,container/ring。本篇介绍conatiner/list

conatiner/list实现了一个双向链表。使用起来与其他语言的动态列表非常相似,3秒钟便可入门。

3秒钟入门

package main

import (
"container/list"
"fmt"
)

func main() {
nums := list.New()
nums.PushBack(1)
nums.PushBack(2)
nums.PushBack(3)
for e := nums.Front(); e != nil; e = e.Next() {
fmt.Println(e.Value)
}
}

包中有什么
包里只导出了两个类型和一个函数:

表示列表的List类型
表示列表元素的Element类型

创建List的函数
container/list––––––––––––––container/list_
// 表示双向列表
type List struct{ ... }

// 表示列表中的元素
type Element struct{ ... }

// 创建List
func New() *List

  


下面详细讲解该包的用法。

Element
先来看看Element类型:

container/list––––––––––––––container/list_
type Element struct {
Value interface{} // 存储在该元素中的值
}

可以看到值的类型为 interface{},因此Element可以存储任何值。

创建List
使用New来创建List,函数原型如下:

container/list––––––––––––––container/list_
func New() *List

示例:

oll := list.New()
添加元素
List导出了六个方法用于添加元素:

container/list––––––––––––––container/list_
// 追加新元素到末尾,返回该元素指针
func (l *List) PushBack(v interface{}) *Element
// 追加另一个列表到末尾
func (l *List) PushBackList(other *List)
// 添加新元素到开头,返回该元素指针
func (l *List) PushFront(v interface{}) *Element
// 添加另一个列表到开头
func (l *List) PushFrontList(other *List)
// 在mark后面插入新元素,返回新元素指针
func (l *List) InsertAfter(v interface{}, mark *Element) *Element
// 在mark前插入新元素,返回新元素指针
func (l *List) InsertBefore(v interface{}, mark *Element) *Element

示例:

// 追加元素到末尾
coll.PushBack(1)
coll.PushBack("Gopher")

// 添加元素到开头
coll.PushFront("Cynhard")
two := coll.PushFront(2)

// 插入元素到two之前
before2 := coll.InsertBefore("Before2", two)

// 插入元素到two之后
after2 := coll.InsertAfter("After2", two)

coll2 := list.New()
coll2.PushBack(3)
coll2.PushFront("Tomcat")

// 追加另外一个列表到末尾
coll.PushBackList(coll2)

// 添加另外一个列表到开头
coll.PushFrontList(coll2)

应注意到一个列表中的元素的值的类型不必一致。

移动元素
List导出了四个方法用于移动元素:

container/list––––––––––––––container/list_
// 移动e到mark之后
func (l *List) MoveAfter(e, mark *Element)
// 移动e到mark之前
func (l *List) MoveBefore(e, mark *Element)
// 移动e到末尾
func (l *List) MoveToBack(e *Element)
// 移动e到开头
func (l *List) MoveToFront(e *Element)

注意e和mark都必须是l的内的元素,否则该函数不执行任何动作。

示例:

two := coll.PushFront(2)
before2 := coll.InsertBefore("Before2", two)
after2 := coll.InsertAfter("After2", two)

// 将before2移动到two的后面
coll.MoveAfter(before2, two)
// 将after2移动到two的前面
coll.MoveBefore(after2, two)
// 将before2移动到开头
coll.MoveToFront(before2)
// 将after2移动到末尾
coll.MoveToBack(after2)

访问元素

List导出了Back()和Front()返回结尾和开头元素:

container/list––––––––––––––container/list_
// 返回结尾元素
func (l *List) Back() *Element
// 返回开头元素
func (l *List) Front() *Element

示例:

fmt.Println(coll.Front().Value) // 打印开头元素的值
fmt.Println(coll.Back().Value) // 打印结尾元素的值

 

遍历列表
Element导出了两个方法Prev()和Next()用以访问前一个或后一个元素:

container/list––––––––––––––container/list_
// 返回下一个元素,如果没有下一个元素,返回nil
func (e *Element) Next() *Element
// 返回前一个元素,如果没有前一个元素,返回nil
func (e *Element) Prev() *Element

示例:

// 顺序遍历
for e := coll.Front(); e != nil; e = e.Next() {
fmt.Print(e.Value, " ")
}
fmt.Println()
// 逆序遍历
for e := coll.Back(); e != nil; e = e.Prev() {
fmt.Print(e.Value, " ")
}
fmt.Println()

获取列表长度

container/list––––––––––––––container/list_
func (l *List) Len() int

示例:

mt.Println(coll.Len())
移除元素
container/list––––––––––––––container/list_
// 移除e,返回e的值
func (l *List) Remove(e *Element) interface{}
// 清空列表
func (l *List) Init() *List

示例:

coll := list.New()
two := coll.PushFront(2)
coll.Remove(two) // 移除two
coll.Init() // 清空列表

完整示例

package main

import (
"container/list"
"fmt"
)

func printList(coll *list.List) {
for e := coll.Front(); e != nil; e = e.Next() {
fmt.Print(e.Value, " ")
}
fmt.Println()
}

func printListR(coll *list.List) {
for e := coll.Back(); e != nil; e = e.Prev() {
fmt.Print(e.Value, " ")
}
fmt.Println()
}

func main() {
coll := list.New()

coll.PushBack(1)
coll.PushBack("Gopher")

coll.PushFront("Cynhard")
two := coll.PushFront(2)

before2 := coll.InsertBefore("Before2", two)
after2 := coll.InsertAfter("After2", two)

coll.MoveAfter(before2, two)
coll.MoveBefore(after2, two)
coll.MoveToFront(before2)
coll.MoveToBack(after2)

coll2 := list.New()
coll2.PushBack(3)
coll2.PushFront("Tomcat")

coll.PushBackList(coll2)
coll.PushFrontList(coll2)

printList(coll)
printListR(coll)

fmt.Println(coll.Front().Value)
fmt.Println(coll.Back().Value)

fmt.Println(coll.Len())

coll.Remove(two)

printList(coll)

coll.Init()
printList(coll)
}

  

 

转载于:https://www.cnblogs.com/dfsxh/p/10318270.html

相关文章:

  • 关于RFC
  • MongoDB官方C#驱动中查询条件Query用法
  • 分享我在学习web前端路上踩过的一些坑
  • MyEclipse10安装PyDev插件
  • Python3获取新浪微博内容乱码问题
  • boost::thread类
  • 一种基于WebRTC与UDP组播的一对多远程控制桌面的实现思路
  • rational clearcase 提交活动注意
  • ELK批量删除索引
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • 华致酒行登陆A股 启幕酒业流通“铂金时代”
  • 【原创】MySQL新旧版本ORDER BY 处理方法
  • HBase笔记6 过滤器
  • Javascript Date原型方法
  • ECMASCript 2019可能会有哪些特性?
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • C++类中的特殊成员函数
  • chrome扩展demo1-小时钟
  • Gradle 5.0 正式版发布
  • IOS评论框不贴底(ios12新bug)
  • Java 内存分配及垃圾回收机制初探
  • java8-模拟hadoop
  • JAVA之继承和多态
  • Python学习之路13-记分
  • Python中eval与exec的使用及区别
  • ubuntu 下nginx安装 并支持https协议
  • unity如何实现一个固定宽度的orthagraphic相机
  • Vultr 教程目录
  • 从0到1:PostCSS 插件开发最佳实践
  • 第2章 网络文档
  • 记一次删除Git记录中的大文件的过程
  • 类orAPI - 收藏集 - 掘金
  • 排序算法学习笔记
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 软件开发学习的5大技巧,你知道吗?
  • 小程序01:wepy框架整合iview webapp UI
  • 新手搭建网站的主要流程
  • 移动端唤起键盘时取消position:fixed定位
  • 用 Swift 编写面向协议的视图
  • 用jQuery怎么做到前后端分离
  • 原生js练习题---第五课
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ###STL(标准模板库)
  • #FPGA(基础知识)
  • #在 README.md 中生成项目目录结构
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (BFS)hdoj2377-Bus Pass
  • (二)hibernate配置管理
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)ssm码农论坛 毕业设计 231126