我的编程空间,编程开发者的网络收藏夹
学习永远不晚

基于golang中container/list包的用法说明

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于golang中container/list包的用法说明

list是一个双向链表

该结构具有链表的所有功能。


type Element
type Element struct {
        Value interface{}   //在元素中存储的值
}
func (e *Element) Next() *Element  //返回该元素的下一个元素,如果没有下一个元素则返回nil
func (e *Element) Prev() *Element//返回该元素的前一个元素,如果没有前一个元素则返回nil。
type List
func New() *List //返回一个初始化的list
func (l *List) Back() *Element //获取list l的最后一个元素
func (l *List) Front() *Element //获取list l的第一个元素
func (l *List) Init() *List  //list l初始化或者清除list l
func (l *List) InsertAfter(v interface{}, mark *Element) *Element  //在list l中元素mark之后插入一个值为v的元素,并返回该元素,如果mark不是list中元素,则list不改变。
func (l *List) InsertBefore(v interface{}, mark *Element) *Element//在list l中元素mark之前插入一个值为v的元素,并返回该元素,如果mark不是list中元素,则list不改变。
func (l *List) Len() int //获取list l的长度
func (l *List) MoveAfter(e, mark *Element)  //将元素e移动到元素mark之后,如果元素e或者mark不属于list l,或者e==mark,则list l不改变。
func (l *List) MoveBefore(e, mark *Element)//将元素e移动到元素mark之前,如果元素e或者mark不属于list l,或者e==mark,则list l不改变。
func (l *List) MoveToBack(e *Element)//将元素e移动到list l的末尾,如果e不属于list l,则list不改变。
func (l *List) MoveToFront(e *Element)//将元素e移动到list l的首部,如果e不属于list l,则list不改变。
func (l *List) PushBack(v interface{}) *Element//在list l的末尾插入值为v的元素,并返回该元素。
func (l *List) PushBackList(other *List)//在list l的尾部插入另外一个list,其中l和other可以相等。
func (l *List) PushFront(v interface{}) *Element//在list l的首部插入值为v的元素,并返回该元素。
func (l *List) PushFrontList(other *List)//在list l的首部插入另外一个list,其中l和other可以相等。
func (l *List) Remove(e *Element) interface{}//如果元素e属于list l,将其从list中删除,并返回元素e的值。

举例说明其用法


package main 
import (
	"container/list"
	"fmt"
)
 
func main() {
	l := list.New() //创建一个新的list
	for i := 0; i < 5; i++ {
		l.PushBack(i)
	}
	for e := l.Front(); e != nil; e = e.Next() {
		fmt.Print(e.Value) //输出list的值,01234
	}
	fmt.Println("")
	fmt.Println(l.Front().Value) //输出首部元素的值,0
	fmt.Println(l.Back().Value)  //输出尾部元素的值,4
	l.InsertAfter(6, l.Front())  //首部元素之后插入一个值为10的元素
	for e := l.Front(); e != nil; e = e.Next() {
		fmt.Print(e.Value) //输出list的值,061234
	}
	fmt.Println("")
	l.MoveBefore(l.Front().Next(), l.Front()) //首部两个元素位置互换
	for e := l.Front(); e != nil; e = e.Next() {
		fmt.Print(e.Value) //输出list的值,601234
	}
	fmt.Println("")
	l.MoveToFront(l.Back()) //将尾部元素移动到首部
	for e := l.Front(); e != nil; e = e.Next() {
		fmt.Print(e.Value) //输出list的值,460123
	}
	fmt.Println("")
	l2 := list.New()
	l2.PushBackList(l) //将l中元素放在l2的末尾
	for e := l2.Front(); e != nil; e = e.Next() {
		fmt.Print(e.Value) //输出l2的值,460123
	}
	fmt.Println("")
	<span style="color:#FF0000;">l.Init()           //清空l</span>
	fmt.Print(l.Len()) //0
	for e := l.Front(); e != nil; e = e.Next() {
		fmt.Print(e.Value) //输出list的值,无内容
	}
 
}

补充:Go标准库学习笔记-双向链表 (container/list)

概述

container/list包实现了基本的双向链表功能,包括元素的插入、删除、移动功能

链表元素

链表中元素定义如下:


type Element struct {
     Value interface{}
}
func (e *Element) Next() *Element
func (e *Element) Prev() *Element

通过Value属性来获取元素的值,此外Element还有两个方法Next和Prev分别获取当前元素的前一个元素和后一个元素。

成员函数

初始化

可以通过调用New函数或者Init方法来初始化一个空的list,此外Init也可以重置一个list。函数声明如下:


func New() *List
func (l *List) Init() *List

遍历

对于链表来说,遍历是最常用的操作,遍历操作一共三步:

第一步,获取一个遍历起始点;使用Front或Back获取一个链表的头和尾,其函数声明如下:


func (l *List) Front() *List
func (l *List) Back() *List

第二步,从当前元素转到下一个元素;使用Element上的Prev和Next方法向前或向后移动一个元素。

第三步,遍历结束条件;遍历结束条件需要人为判断,一般比较当前元素是否为结束元素。

插入

container/list中提供了两种插入方法,InsertAfter和InsertBefore,分别用于在一个元素前或后插入元素,方法声明如下:


func (l *List) InsertAfter(v interface{}, mark *Element) *Element
func (l *List) InsertBefore(v interface{}, mark *Element) *Element

添加

PushBack和PushFront用于在一个链表的头和尾添加元素(此外还有一次性添加一个list的PushBackList和PushFrontList),方法声明如下:


func (l *List) PushBack(v interface{}) *Element
func (l *List) PushFront(v interface{}) *Element

删除

可以通过Remove方法,删除链表上指定元素,方法声明如下:


func (l *List) Remove(e *Element) interface{}

使用实例

实际上,将前面的内容整合起来,就可以实现一个简单的遍历链表的功能。下面是一个简单的遍历实现


package main
import (
"fmt"
"container/list"
)
func main() {
    link := list.New()
    for i := 0; i <= 10; i++ {
        link.PushBack(i)
    }//
    for p := link.Front(); p != link.Back(); p = p.Next() {
        fmt.Println("Number", p.Value)
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

基于golang中container/list包的用法说明

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

基于@AliasFor注解的用法及说明

这篇文章主要介绍了基于@AliasFor注解的用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-27

React中关于render()的用法及说明

这篇文章主要介绍了React中关于render()的用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-12

Python中关于*args与**args的用法及说明

这篇文章主要介绍了Python中关于*args与**args的用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-06

mybatis中关于in的使用方法及说明

这篇文章主要介绍了mybatis中关于in的使用方法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-27

golang testscript .txtar 语法,用于 stderr 或 stdout 中包含的文本

问题内容我正在学习如何使用 https://github.com/rogpeppe/go-internal testscript 模块测试 cli 程序。当我在 .txtar 文件中使用此行时:stderr /No help topi
golang testscript .txtar 语法,用于 stderr 或 stdout 中包含的文本
2024-02-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录