Go语言的list包(列表)链表

Go语言的list包(列表)链表

Go语言的list包(列表)链表

创建链表:可以使用list包中的List结构体来创建一个链表,并使用Node结构体来添加节点。
遍历链表:可以使用for循环来遍历链表,从而获取每个节点的值。
查找链表:可以使用for循环来查找链表中指定的节点,从而获取该节点的值。
删除链表:可以使用for循环来删除链表中指定的节点,从而删除该节点。
在 Go 语言中,列表使用 container/list 包来实现,内部的实现原理是双链表,列表能够高效地进行任意位置的元素插入和删除操作。

1 创建链表

使用 list.New 初始化列表:listName := list.New()

说明
通过 list.New 初始化了一个名为 listName 的列表。

使用 var 初始化列表:var listName = list.List

package main

import (
	"container/list"
	"fmt"
)

func main() {
	//通过 list.New 创建列表
	listHaiCoder := list.New()
	listHaiCoder.PushBack("Hello")
	listHaiCoder.PushBack("HaiCoder")
	
	for i := listHaiCoder.Front(); i != nil; i = i.Next() {
		fmt.Println("Element =", i.Value)
	}
}

2 list 插入元素

Golang 的列表元素的插入有四种情景,分别为:

在指定元素前插入
在指定元素后插入
在列表头部插入
在列表尾部插入
指定位置插入元素语法

InsertBefore(v interface {}, mark * Element) *Element

参数

参数 描述
v 要插入的元素。
mark 列表的节点。
返回值

返回值 描述
Element 元素节点。
在列表指定元素后插入:
InsertAfter(v interface {}, mark * Element) *Element

在列表头部插入
PushFront(v interface{}) *Element

在列表尾部插入
PushBack(v interface{}) *Element

2.1 在列表头部插入元素

使用 PushFront 在列表头部插入元素。

package main

import (
	"container/list"
	"fmt"
)

func main() {
	//使用 PushFront 在列表头部插入元素
	listHaiCoder := list.New()
	listHaiCoder.PushFront("Hello")
	listHaiCoder.PushFront("HaiCoder")

	for i := listHaiCoder.Front(); i != nil; i = i.Next() {
		fmt.Println("Element =", i.Value)
	}
}

2.2 在列表尾部插入元素

使用 PushBack 在列表尾部插入元素

package main

import (
	"container/list"
	"fmt"
)

func main() {
	//使用 PushFront 在列表头部插入元素
	listHaiCoder := list.New()
	listHaiCoder.PushBack("Hello")
	listHaiCoder.PushBack("HaiCoder")

	for i := listHaiCoder.Front(); i != nil; i = i.Next() {
		fmt.Println("Element =", i.Value)
	}
}

2.3 在指定元素前插入元素

使用 InsertBefore 在列表的指定元素前插入元素

package main

import (
	"container/list"
	"fmt"
)

func main() {
	//使用 InsertBefore 在列表的指定元素前插入元素
	listHaiCoder := list.New()
	element := listHaiCoder.PushBack("Hello")
	element = listHaiCoder.InsertBefore("HaiCoder", element)
	listHaiCoder.InsertBefore("wgchen", element)

	for i := listHaiCoder.Front(); i != nil; i = i.Next() {
		fmt.Println("Element =", i.Value)
	}
}

2.4 在指定元素后插入元素

使用 InsertAfter 在列表的指定元素后插入元素

package main

import (
	"container/list"
	"fmt"
)

func main() {
	//使用 InsertAfter 在列表的指定元素后插入元素
	listHaiCoder := list.New()
	element := listHaiCoder.PushBack("Hello")
	element = listHaiCoder.InsertAfter("HaiCoder", element)
	listHaiCoder.InsertAfter("wgchen", element)

	for i := listHaiCoder.Front(); i != nil; i = i.Next() {
		fmt.Println("Element =", i.Value)
	}
}

2.5 列表 list 插入列表

Golang 的列表除了支持 插入元素外,还可以将整个列表插入到另一个列表中。在一个列表中插入另一个列表,只支持两种情况,分别为:

头部插入列表:PushFrontList(other *List)
尾部插入列表:PushBackList(other *List)
在头部插入列表

package main

import (
	"container/list"
	"fmt"
)

func main() {
	//使用 PushFrontList 在列表头部插入一个列表
	listHaiCoder := list.New()
	listHaiCoder.PushFront("hello")
	listHaiCoder.PushFront("haicode")

	listInsert := list.New()
	listInsert.PushBack("wgchen")
	listInsert.PushBack("willem")

	listHaiCoder.PushFrontList(listInsert)
	for i := listHaiCoder.Front(); i != nil; i = i.Next() {
		fmt.Println("Element = ", i.Value)
	}
}

在尾部插入列表

使用 PushBackList 在列表尾部插入一个列表

package main

import (
	"container/list"
	"fmt"
)

func main() {
	//使用 PushFrontList 在列表头部插入一个列表
	listHaiCoder := list.New()
	listHaiCoder.PushFront("hello")
	listHaiCoder.PushFront("haicode")

	listInsert := list.New()
	listInsert.PushBack("wgchen")
	listInsert.PushBack("willem")

	listHaiCoder.PushBackList(listInsert)
	for i := listHaiCoder.Front(); i != nil; i = i.Next() {
		fmt.Println("Element = ", i.Value)
	}
}

3 列表 list 删除元素

Golang 的列表的删除元素使用 remove 函数,删除的元素不能为空,如果为空,会报异常。

package main

import (
	"container/list"
	"fmt"
)

func main() {
	//使用 Remove 在列表中删除元素
	listHaiCoder := list.New()
	listHaiCoder.PushFront("hello")
	haicode := listHaiCoder.PushFront("haicode")

	listInsert := list.New()
	listInsert.PushBack("wgchen")
	listInsert.PushBack("willem")

	listHaiCoder.PushBackList(listInsert)
	removeEle := listHaiCoder.Remove(haicode)
	fmt.Println("RemoveElement =", removeEle)

	for i := listHaiCoder.Front(); i != nil; i = i.Next() {
		fmt.Println("Element = ", i.Value)
	}
}

删除空元素
使用 Remove 在列表中删除空元素,报错。

4 列表 list 遍历

列表的 Front 函数返回的是列表的头元素,
Next 是实现列表的指针后移,
for 循环的结束条件是列表的节点为 nil。

链表的倒序遍历是使用 for 循环加上 list 内置的 Back 函数和 Prev 函数来实现。

列表的 Back 函数返回的是列表的尾元素,
Prev 是实现列表的指针前移。

4.1 列表正序遍历

正序遍历列表,并打印列表的每一个元素。

package main

import (
	"container/list"
	"fmt"
)

func main() {
	listHaiCoder := list.New()
	listHaiCoder.PushFront("hello")
	listHaiCoder.PushFront("haicode")

	for i := listHaiCoder.Front(); i != nil; i = i.Next() {
		fmt.Println("Element = ", i.Value)
	}
}

4.2 列表倒叙遍历

倒叙遍历列表,并打印列表的每一个元素。

package main

import (
	"container/list"
	"fmt"
)

func main() {
	listHaiCoder := list.New()
	listHaiCoder.PushFront("hello")
	listHaiCoder.PushFront("haicode")

	for i := listHaiCoder.Back(); i != nil; i = i.Prev() {
		fmt.Println("Element = ", i.Value)
	}
}

5 列表 list 元素移动

Golang 的列表元素的移动有两种情景,分别为:

将指定元素移动到另一元素的前面
将指定元素移动到另一元素的后面

5.1 移到元素前

将元素 e 移动到元素 mark 的前面。

package main

import (
	"container/list"
	"fmt"
)

func main() {
	//将元素 e 移动到元素 mark 的前面
	listHaiCoder := list.New()
	listHaiCoder.PushFront("hello")
	listHaiCoder.PushFront("haicode")

	el1 := listHaiCoder.PushFront("aa")
	el2 := listHaiCoder.PushFront("cc")

	for i := listHaiCoder.Back(); i != nil; i = i.Prev() {
		fmt.Printf("%s ", i.Value)
	}

	fmt.Println("=========================================")
	listHaiCoder.MoveBefore(el1, el2)

	for i := listHaiCoder.Back(); i != nil; i = i.Prev() {
		fmt.Printf("%s ", i.Value)
	}
}

————————————————
版权声明:本文为CSDN博主「知其黑、受其白」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weiguang102/article/details/129212481

Go语言中的环形双向链表是通过`container/ring`来实现的。在这个中,首先我们定义了一个`Ring`结构体,它含了指向前一个和后一个元素的指针,以及一个值字段用于存储链表的值。这个结构体通过方法来实现链表的各种操作。 要生成一个链表,我们可以使用`New`函数来创建一个空的环形链表,然后使用`Link`方法将不同的元素连接起来。对于每个元素,我们可以使用`Value`字段来存储相应的值。 在环形链表中,我们可以通过`Move`方法来移动当前指针到下一个或上一个元素,并可以使用`Prev`和`Next`方法来获取前一个和后一个元素。 要删除链表中的元素,我们可以使用`Unlink`方法将指定的元素从链表中移除。要插入一个新元素,我们可以使用`Link`方法将新元素插入到指定元素之前。 对于环形双向链表的查询操作,我们可以使用`Do`方法来遍历整个链表并对每个元素执行指定的函数。另外,我们还可以使用`Len`方法来获取链表的长度。 总结起来,Go语言的环形双向链表通过`container/ring`提供了一种简单而灵活的数据结构,可以方便地进行链表的增删改查操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Go语言标准库学习之container——Go语言如何实现单链表、循环链表、双向链表、堆](https://blog.csdn.net/random_w/article/details/108096981)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值