从零开始学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

原文地址:https://www.cnblogs.com/VingB2by/p/11087327.html

时间: 2024-10-29 11:07:27

从零开始学Go之容器(四):列表的相关文章

从零开始学ios开发(四):IOS控件(1),Image View、Text Field、Keyboard

长话短说,谢谢大家的关注,这篇写了好长时间,下面继续学习ios.我将用2到3篇的篇幅来学习iphone上的一些常用控件,包括Image View.Text Field.Keyboard.Slider等等,这篇的内容包括ImageView和Keyboard的使用.完成后的效果图如下: 1)创建一个新的project,选择“Single View Application”,命名为“Control Fun”,然后保存.一些和前几章相似的步骤在从这篇起就开始一笔待过了,也不再做截图了,例如这里的创建一个

从零开始学Go之容器(二):切片

切片(slice)是对数组一个连续片段的引用(该数组我们称之为相关数组,通常是匿名的),所以切片是一个引用类型. 切片的内部结构包含开始位置地址(&).大小(len)和容量(cap). 切片并不存储任何数据,它只是描述了底层数组中的一段. 更改切片的元素会修改其底层数组中对应的元素. 声明: var 数组名 []类型 var a []int 切片的声明跟数组很相似,但是长度是不定长的,所以不需要说明长度. 切片的初始化与使用: var 数组名 []类型{初始化值列表} var a []int{1

从零开始学android<BroadCast广播.四十五.>

与Service相似,在android中还有一种运行在后台的4大组件之一,他就是broadCcast,但是他不用考虑是否有接受的对象,只需要考虑发送即可. 要想使用BroadCast我们可以使用两种方法 第一:将broadCcast配置到配置文件当中. 第二:将broadCcast与class文件进行绑定. 下面我们分别来进行说明. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

从零开始学android&lt;Intent进阶.四十一.&gt;

前一节我们学习了Intent的基本用法,多个Activity之间的转跳并传递信息. 今天我们使用Intnet来完成一些 特殊的操作,比如拨打电话,发送短信,浏览网页等-- OK废话不多说,直接上教程,具体会在代码注释中具体讲解 1.使用Intent打开网页 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.andro

从零开始学android&lt;Intent初步.四十.&gt;

Intent意图是android中非常重要的部分,他在Activity,service中有较为广泛的应用. 1 public void startActivity(Intent intent) 普通 启动一个Activity,并通过Intent传送数据 2 public void startActivityForResult(Intent intent, int requestCode) 普通 启动并接收另一个Activity程序回传数据,当requestCode大于0才可以触发onActivi

从零开始学_JavaScript_系列(四)——jquery(基础,选择器,触发条件,动画,回调函数)

jQuery语法 (1)引用jquery文件及下载库: http://jquery.com/download/ 下载 Download the compressed, production jQuery 2.2.2 这个是用户版的,已经被精简和压缩. 然后使用 <script src="jquery.js"></script> 来启动这个库文件,记得将下载的文件重命名为jquery.js 也可以使用谷歌和微软的CDN,不过这里略. (2)jQuery语法 $ (

从零开始学android&lt;Notification通知.四十四.&gt;

在android中有时会在主界面上收到某些应用的推送,有的可以包含图片,声音或者震动效果,当点击这些提示时,有时还可以进入到发送提示的的应用. 这些提示的推送就是通知,当然通知早根本上也是你一种服务. 首先想要使用通知就必须使用到Notification.Builder 和NotificationManager这两个类 使用Notification.Builder来取得Notification对象,使用NotificationManager来取得操作通知的对象 当然,我们也可以使用RemoteV

从零开始学android&lt;Service服务.四十三.&gt;

在Android系统开发之中,Services是一个重要的组成部分.如果现在某些程序需要中的部分操作是很消耗时间的,那么可以将这些程序定义在Service之中,这样就可以完成程序的后台运行(也可以在不显示界面的形式下运行),即:Services实际上就相当于是一个没有图形界面的Activity程序,而且当用户要执行某些操作需要进行跨进程访问的时候也可以使用Service来完成. Service是一个没有UI界面的操作组件,主要的功能是为Activity程序提供一些必要的支持,例如:手机中的Mp3

从零开始学Go之容器(三):映射

map 是一种特殊的数据结构:一种元素对(pair)的无序集合,pair 的一个元素是 key,对应的另一个元素是 value,所以这个结构也称为关联数组或字典. 声明: var 映射名称 map[键类型]值类型 var map1 map[string]int key 可以是任意可以用 == 或者 != 操作符比较的类型,比如 string.int.float value 可以是任意类型的:通过使用空接口类型,我们可以存储任意值,但是使用这种类型作为值时需要先做一次类型断言 在map中key值是