• 【愚公系列】2022年07月 Go教学课程 023-Go容器之列表



    一、Go容器之列表

    1.列表的定义

    列表是一种数据结构,由多元素成的有限序列,即按照一定的线性顺序排列而成的数据项的集合,在这种数据结构上可以进行元素的的插入,删除,修改,和查找。

    列表的两种主要表现是数组和链表,栈和队列是两种特殊类型的列表。列表(list)底层常见的数据结构有: 单链表、双链表等。

    2.Go中的列表

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

    列表(list)能够方便高效地进行元素的删除、插入操作。

    3.列表的声明

    变量名 := list.New()
    //或
    var 变量名 = list.List
    
    • 1
    • 2
    • 3

    4.列表的操作

    4.1 列表添加元素

    列表添加元素如下所示:

    方法功能
    InsertAfter(v interface{}, mark *Element) *Element在 mark 点后面插入元素
    InsertBefore(v interface{}, mark *Element) *Element在 mark 点前面插入元素
    PushFrontList(other *List)添加 other 列表中的元素到头部
    PushBackList(other *List)添加 other 列表中的元素到尾部

    相关案例:

    package main
    
    import (
    	"container/list"
    	"fmt"
    )
    
    func main() {
    	l := list.New()
    
    	l.PushFront("头部愚公")
    	l.PushBack("尾部愚公")
    
    	// 遍历
    	for i := l.Front(); i != nil; i = i.Next() {
    		fmt.Println(i.Value)
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述
    其中 i := l.Front() 表示初始赋值,用来获取列表的头部下标;
    然后每次会循环会判断 i != nil,若等于空,则会退出循环,否则执行 i.Next()继续循环下一个元素;

    4.1 列表删除元素

    package main
    
    import (
    	"container/list"
    	"fmt"
    )
    
    func main() {
    	l := list.New()
    
    	// 头部添加字符串
    	l.PushFront("愚公1号")
    
    	// 尾部添加字符串
    	l.PushBack("愚公2号")
    
    	// 尾部添加一个整型,并保持元素句柄
    	element := l.PushBack(1)
    
    	// 在 1 之后添加字符串 2
    	l.InsertAfter("2", element)
    
    	// 在 1 之前添加字符串 0
    	l.InsertBefore("0", element)
    	for i := l.Front(); i != nil; i = i.Next() {
    		fmt.Println(i.Value)
    	}
    	// 删除 element 对应的元素
    	l.Remove(element)
    
    	// 遍历
    	for i := l.Front(); i != nil; i = i.Next() {
    		fmt.Println(i.Value)
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    在这里插入图片描述

    4.3 列表获取元素

    4.3.1 获取列表头结点

    package main
    
    import (
    	"container/list"
    	"fmt"
    )
    
    func main() {
    	l := list.New()
    
    	// 头部添加字符串
    	l.PushFront("愚公1号")
    
    	// 尾部添加字符串
    	l.PushBack("愚公2号")
    
    	// 尾部添加一个整型,并保持元素句柄
    	element := l.PushBack(1)
    
    	// 在 1 之后添加字符串 2
    	l.InsertAfter("2", element)
    	
    	fmt.Println("Front =", l.Front().Value)
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这里插入图片描述

    4.3.2 获取列表尾结点

    package main
    
    import (
    	"container/list"
    	"fmt"
    )
    
    func main() {
    	l := list.New()
    
    	// 头部添加字符串
    	l.PushFront("愚公1号")
    
    	// 尾部添加字符串
    	l.PushBack("愚公2号")
    
    	// 尾部添加一个整型,并保持元素句柄
    	element := l.PushBack(1)
    
    	// 在 1 之后添加字符串 2
    	l.InsertAfter("2", element)
    
    	fmt.Println("Front =", l.Back().Value)
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这里插入图片描述

    4.3.3 获取上一个结点

    package main
    
    import (
    	"container/list"
    	"fmt"
    )
    
    func main() {
    	//使用列表内置的 Prev() 函数,获取列表的上一个结点
    	listHaiCoder := list.New()
    	listHaiCoder.PushFront("1")
    	element := listHaiCoder.PushFront("2") //定义节点位置
    	listHaiCoder.PushFront("3")
    	preElement := element.Prev()
    	fmt.Println("preElement =", preElement.Value)
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    4.3.4 获取下一个结点

    package main
    
    import (
    	"container/list"
    	"fmt"
    )
    
    func main() {
    	//使用列表内置的 Prev() 函数,获取列表的上一个结点
    	listHaiCoder := list.New()
    	listHaiCoder.PushFront("1")
    	element := listHaiCoder.PushFront("2") //定义节点位置
    	listHaiCoder.PushFront("3")
    	preElement := element.Next()
    	fmt.Println("preElement =", preElement.Value)
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

  • 相关阅读:
    C# 零基础搭建一个简单的Asp.Net Core WebAip
    1011 World Cup Betting
    java mybatisplus generator 修改字段类型
    Java 网络编程之TCP(五):分析服务端注册OP_WRITE写数据的各种场景(三)
    为什么要做媒体发稿?企业为什么都注重媒体推广?
    【Java 进阶篇】JDBC 数据库连接池 C3P0 详解
    2023华为杯数学建模竞赛E题
    Linux基础入门到精通之虚拟机网络设置说明
    校园防疫管理系统功能详解,请查看
    面试经典-Spring篇
  • 原文地址:https://blog.csdn.net/aa2528877987/article/details/126087276