学习 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

总结

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


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

相关文章
|
8天前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
12天前
|
程序员 Go 云计算
2023年学习Go语言是否值得?探索Go语言的魅力
2023年学习Go语言是否值得?探索Go语言的魅力
|
5天前
|
存储 C语言
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
|
11天前
|
搜索推荐 算法 Go
深入探索堆:Go语言中的高效数据结构
深入探索堆:Go语言中的高效数据结构
|
5天前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
6天前
|
JSON 缓存 监控
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
Viper 是一个强大的 Go 语言配置管理库,适用于各类应用,包括 Twelve-Factor Apps。相比仅支持 `.ini` 格式的 `go-ini`,Viper 支持更多配置格式如 JSON、TOML、YAML
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
|
11天前
【数据结构】双向带头(哨兵位)循环链表 —详细讲解(赋源码)
【数据结构】双向带头(哨兵位)循环链表 —详细讲解(赋源码)
21 4
|
3天前
|
算法
【数据结构与算法】共享双向链表
【数据结构与算法】共享双向链表
4 0
|
3天前
|
算法
【数据结构与算法】双向链表
【数据结构与算法】双向链表
4 0
|
3天前
|
算法
【数据结构与算法】循环链表
【数据结构与算法】循环链表
4 0