[Golang] list 包常用方法及操作

前言

  • 最近在学算法,栈的部分涉及到了list包的使用,于是我就打算整理一下它的基本用法。
  • 本篇文章只讲到主要用法,并没有讲完所有用法。
    List的全部方法
    (这是List的全部用法。)

1.概述

  • 在 Go 语言中,container/list包提供了一个实现双向链表的数据结构。这个包中的链表可以高效地在头部、尾部或者中间插入和删除元素,并且支持遍历操作。

2.主要数据结构

  • List:这是整个链表的结构体。它包含了链表的头节点和尾节点的指针,以及链表的长度等信息。通过list.New()函数可以创建一个新的List实例。
  • Element:它代表链表中的一个元素。每个元素包含一个指向前后相邻元素的指针(prevnext),以及一个用于存储元素值的接口类型的字段(Value)。接口类型使得Element可以存储任意类型的值。

3.常用操作方法

  • 创建链表
    • New函数
      • 语法func New() *List
      • 示例:以下所有函数及方法的示例都在基本讲解之后。
      • 解释:这是创建一个新的空链表的方法。它返回一个指向List结构体的指针,通过这个指针可以对链表进行各种操作。
  • 插入元素
    • PushFront方法
      • 语法func (l *List) PushFront(v interface{}) *Element
      • 解释:将一个元素插入到链表的头部。它接受一个interface{}类型的参数(可以是任何类型的值),并返回一个指向新插入元素的*Element指针。
    • PushBack方法
      • 语法func (l *List) PushBack(v interface{}) *Element
      • 解释:将一个元素插入到链表的尾部,同样接受任何类型的值作为参数,并返回指向新插入元素的指针。
    • InsertAfter方法
      • 语法func (l *List) InsertAfter(v interface{}, mark *Element) *Element
      • 解释:在指定的mark元素之后插入一个新元素v。它需要两个参数,一个是要插入的元素值(v),另一个是已经存在于链表中的*Element指针(mark),用于指定插入位置,最后返回指向新插入元素的指针。
    • InsertBefore方法
      • 语法func (l *List) InsertBefore(v interface{}, mark *Element) *Element
      • 解释:在指定的mark元素之前插入一个新元素v,参数和返回值的类型与InsertAfter类似。
//New函数
l := list.New();
//PushFront方法
l := list.New(); element := l.PushFront(10);
//PushBack方法
l := list.New(); element := l.PushBack(20);
//InsertAfter方法
l := list.New();
element1 := l.PushBack(30); 
element2 := l.InsertAfter(40, element1);
//InsertBefore方法
l := list.New(); 
element1 := l.PushBack(50);
element2 := l.InsertBefore(60, element1);
  • 遍历元素
    • ForEach方法

      • 语法func (l *List) ForEach(f func(interface{}))
      • 示例:示例在后面。
    • 通过迭代器遍历

      • 可以使用FrontNext方法进行迭代。Front方法返回链表的第一个元素的*Element指针,Next方法用于获取当前元素的下一个元素的指针。
      • 示例l := list.New(); l.PushBack(4); l.PushBack(5); l.PushBack(6);for e := l.Front(); e!= nil; e = e.Next() { fmt.Println(e.Value) }
      • 解释:首先通过l.Front()获取链表头部元素的指针,然后在循环中通过e.Next()不断获取下一个元素的指针,直到enil(表示到达链表尾部),在循环体中可以通过e.Value访问每个元素的值并进行相应操作。
      • Front方法
        • 语法func (l *List) Front() *Element
        • 功能:这个方法用于获取链表的第一个元素(头部元素)的指针。它是一个*Element类型的指针,如果链表为空,则返回nil
      • Next方法
        • 语法func (e *Element) Next() *Element
        • 功能Next方法是定义在Element结构体上的方法。它用于获取当前元素的下一个元素的指针。如果当前元素是链表中的最后一个元素,那么Next方法返回nil
        • 示例
//ForEach方法
l := list.New(); 
l.PushBack(1);
l.PushBack(2); 
l.PushBack(3);
l.ForEach(func(v interface{}) { fmt.Println(v) });
//Front方法
func main() {
    myList := list.New()
    myList.PushBack(10)
    myList.PushBack(20)
    firstElement := myList.Front()
    if firstElement!= nil {
        fmt.Println(firstElement.Value)
    }
}
//Next方法
func main() {
    myList := list.New()
    element1 := myList.PushBack(30)
    element2 := myList.PushBack(40)
    currentElement := element1
    nextElement := currentElement.Next()
    if nextElement == element2 {
        fmt.Println("Next element is correct")
    }
}
  • 删除元素
    • Remove方法
      • 语法:func (l *List) Remove(e *Element) interface{}
      • 解释:从链表中删除指定的*Element。它接受一个指向要删除元素的指针e,并返回被删除元素的值(interface{}类型)。这在需要获取被删除元素的值或者清理链表中的特定元素时非常有用。
      • 示例:
l := list.New();
element := l.PushBack(7); 
l.Remove(element);

结语

  • 其实list包里面还封装了很多方法,大家有兴趣可以去看看源码。
  • 这篇文章到这里就结束了,希望能够帮到你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值