list的声明、遍历及常用方法

本文详细介绍了Go语言中list的实现原理,它基于双向链表,允许在任意位置插入和删除元素。文章通过示例展示了如何声明、初始化、添加数据到list,以及如何遍历和操作list。同时,文章强调了Go语言list的灵活性,它不限制元素类型。此外,还提供了遍历list的两种方法:正向和反向。最后,通过一个函数证明了list在Go中是值类型的特点。
摘要由CSDN通过智能技术生成

list是列表,一种非连续存储的容器,由多个节点组成,节点通过一些变量记录彼此之间的关系。list有多种实现方法,如单向链表、双向链表等。
Go语言中的list的实现原理是双向链表,list能高效地进行任意位置的元素插入和删除操作。
Golang的标准库提供了高级的数据结构List,具体在包container/list。
container/list包里主要有两个数据结构类型:“Element”、“List”;
Element类型代表双向链表中的一个元素,相当于C++里面的“iterator”
List代表一个双向链表。List零值为一个空的、可用的链表。
Element有Prev和Next方法用于得到前一个或者下一个element,element可以直接调用value属性;

 

声明list
格式:变量名:= list.New()
      var 变量名 list.List
list与切片、Map不一样,没有具体元素类型的限制。
在java、c++等里面,list的成员必须是同一个数据类型,但是Go语言中却允许list里插入任意类型成员。
建议使用New()实现list。

 

list的声明及添加数据

为了等下的代码能更直观的运行,先写两个print的函数

func printList(i string, l list.List) {
    fmt.Println(i)
    fmt.Printf("类型:%T, 值:%v, 长度:%d \n", l, l, l.Len())
}
 
func printIterateList(l list.List){
    for e:=l.Front();e!=nil; e= e.Next(){
        fmt.Printf("%T ,%v \t", e.Value, e.Value)
    }
}

用第一种方式声明及添加数据

func testListNew() {
    var list1 list.List
    printList("测试声明list", list1)
    //测试声明list
    // 类型:list.List, 值:{{<nil> <nil> <nil> <nil>} 0}, 长度:0
 
    //添加数据
    list1.PushFront(true)
    list1.PushFront("aaaa")
    list1.PushFront(1.23456)
    list1.PushFront(123)
    //尾部添加数据
    list1.PushBack("一二三")
    printList("添加数据以后list", list1)
    //添加数据以后list
    // 类型:list.List, 值:{{0xc000062360 0xc000062390 <nil> <nil>} 5}, 长度:5
 
    printIterateList(list1)
    //int ,123     float64 ,1.23456     string ,aaaa     bool ,true     string ,一二三
}

第二种方式声明及其他相关函数

func testList1(){
    list1 := list.New()
    //用list.New()声明的list,返回的是一个指针,所以必须加上一个*号
    printList("",*list1)
    list1.PushBack("bbbbb")
    list1.PushFront(1)
    element1 := list1.PushBack("ccccc")
    //在element1后面插入数据
    list1.InsertAfter("aaaaa",element1)
    //在element1前面插入数据
    list1.InsertBefore(50,element1)
    printIterateList(*list1)
 
    fmt.Println()
    //移除element1
    list1.Remove(element1)
    printIterateList(*list1)
 
    list2 := list.New()
    list2.PushFront("1234")
    list2.PushBack("5678")
 
    fmt.Println()
    //在list1前面添加list2列表
    list1.PushFrontList(list2)
    printIterateList(*list1)
 
    list3 := list.New()
    list3.PushFront("abcd")
    list3.PushBack("efgh")
 
    fmt.Println()
    //在lisi1后面添加list3、
    list1.PushBackList(list3)
    printIterateList(*list1)
}

list的遍历:

先建一个变量

var list2 list.List

然后开始遍历该list

//遍历list,顺序遍历
func iterateList1() {
    for e := list2.Front(); e != nil; e = e.Next() {
        fmt.Println(e.Value)
    }
}
 
//遍历list,逆序遍历
func iterateList2() {
    for e := list2.Back(); e != nil; e = e.Prev() {
        fmt.Println(e.Value)
    }
}

list是值类型:

用一个函数来证明list是值类型。

func testList2(l list.List){
    l.PushFront("一")
    l.PushBack("三")
    printIterateList(l)
 
    fmt.Println(l.Len())
}
 
 
//说明list是值类型
func main() {
    printIterateList(list2)
    fmt.Println()
    testList2(list2)
    list2.PushFront("二")
    printIterateList(list2)
    fmt.Println()
    testList2(list2)
}

 

 

本文转载自:https://blog.csdn.net/ynzcxx/article/details/96355176

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值