学习 Go 语言数据结构:实现双链表(下)

简介: 双链表 (Doubly Linked List),每个节点持有一个指向列表前一个元素的指针,以及指向下一个元素的指针。

扩展功能

可以为双链表扩展其他功能,读者可以思考如何实现

链表长度

func size(head *Node) int {
  if head == nil {
    fmt.Println("-> Empty list!")
    return 0
  }
  count := 0
  for head != nil {
    count++
    head = head.Next
  }
  return count
}


运行程序:

$ go run main.go
1 <-> 2 <-> 3 <-> 4 <-> 5 
双链表的长度:  5

插入

一个新节点可以很容易地插入到双向链表中。我们只需要设置指针 prev_node 和 next_node 小心地将 prev_node 和 next_node 节点与适当的指针链接起来。


如果要在节点 n1 和 n3 之间插入节点 n2,则应将 n2 的指针 prev_node 设置为 n1,将 n2 的指针 next_node 设置为 n3。


双向链表中的插入可以通过多种方式完成:


  1. 在节点之间插入
  2. 在双链表开头插入
  3. 插入一个空链表
  4. 在双链表末尾插入

删除

在双向链表中可以很容易地删除节点。我们只需要将指针 prev_node 和 next_node 逻辑设置为节点。可以通过以下方式删除节点:


  1. 删除最后的节点
  2. 删除第一个节点
  3. 在节点之间删除

反转双链表

假设我们有四个节点 n1、n2、n3 和 n4


反转的步骤如下:


  1. 指针 head 指向最后一个节点 n4
  2. 由于 n4 现在是第一个节点,它的 prev_node 指针必须为 NULL
  3. 节点 n1 是最后一个节点,因此它的 next_node 必须为 NULL
  4. n4 的指针 next_node 指向 n3,n3 的 next_node 指向 n2,n2 的 next_node 指向 n1
  5. n1 的指针 prev_node 指向 n2,n2 的 prev_node 指向 n3,n3 的 prev_node 指向 n4

总结

与单链表相比,双链表具有多样性,可以从任何方向遍历双向链表,从而更方便的插入和删除元素。


但是为了维护每个节点的指针,会多一些额外的开销。

相关文章
|
19天前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
63 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
1月前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
43 7
|
1月前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
1月前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
106 71
|
1月前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
110 67
|
1月前
|
Go 索引
go语言for遍历数组或切片
go语言for遍历数组或切片
107 62
|
4天前
|
监控 安全 算法
深度剖析核心科技:Go 语言赋能局域网管理监控软件进阶之旅
在局域网管理监控中,跳表作为一种高效的数据结构,能显著提升流量索引和查询效率。基于Go语言的跳表实现,通过随机化索引层生成、插入和搜索功能,在高并发场景下展现卓越性能。跳表将查询时间复杂度优化至O(log n),助力实时监控异常流量,保障网络安全与稳定。示例代码展示了其在实际应用中的精妙之处。
27 9
|
14天前
|
算法 安全 Go
Go 语言中实现 RSA 加解密、签名验证算法
随着互联网的发展,安全需求日益增长。非对称加密算法RSA成为密码学中的重要代表。本文介绍如何使用Go语言和[forgoer/openssl](https://github.com/forgoer/openssl)库简化RSA加解密操作,包括秘钥生成、加解密及签名验证。该库还支持AES、DES等常用算法,安装简便,代码示例清晰易懂。
47 12
|
1月前
|
存储 Go
go语言中映射
go语言中映射
42 11
|
1月前
|
Go
go语言for遍历映射(map)
go语言for遍历映射(map)
44 12