Go语言数据结构详解:双链表
创作时间:
作者:
@小白创作中心
Go语言数据结构详解:双链表
引用
1
来源
1.
https://www.ctyun.cn/zhishi/p-414347
双链表是数据结构中一种重要的线性结构,相比单链表,它提供了更多的便利性和灵活性。本文将详细介绍双链表的基本概念、实现方法以及一些常见的操作,帮助读者深入理解这一数据结构。
双链表
双链表(Doubly Linked List)是一种链式数据结构,其中每个节点包含三个部分:数据域、前驱指针和后继指针。具体来说,每个节点持有一个指向列表前一个元素的指针(Prev),以及指向下一个元素的指针(Next)。
双向链表的节点中包含 3 个字段:
- 数据域:存储实际的数据
- Next指针:指向双链表中的下一个节点
- Prev指针:指向双链表中的前一个节点
结构体定义如下:
type Node struct {
Prev *Node
Value int
Next *Node
}
实际应用:音乐播放器的播放列表就是一个很好的例子,使用双向链表可以快速访问上一个歌曲和下一首歌曲。
创建节点
创建新节点的函数如下:
func CreateNewNode(value int) *Node {
var node Node
node.Next = nil
node.Value = value
node.Prev = nil
return &node
}
双链表遍历
双向链表的遍历与单链表类似,需要首先检查链表是否为空。之后依次访问每个节点直到结束。
func TraverseDoublyLinkedList(head *Node) {
if head == nil {
fmt.Println("-> Empty list!")
return
}
for head != nil {
if head.Next != nil {
fmt.Printf("%d <-> ", head.Value)
} else {
fmt.Printf("%d ", head.Value)
}
head = head.Next
}
fmt.Println()
}
为了测试,完整的代码如下:
package main
import "fmt"
type Node struct {
Prev *Node
Value int
Next *Node
}
func CreateNewNode(value int) *Node {
var node Node
node.Next = nil
node.Value = value
node.Prev = nil
return &node
}
func TraverseDoublyLinkedList(head *Node) {
if head == nil {
fmt.Println("-> Empty list!")
return
}
for head != nil {
if head.Next != nil {
fmt.Printf("%d <-> ", head.Value)
} else {
fmt.Printf("%d ", head.Value)
}
head = head.Next
}
fmt.Println()
}
func main() {
// 1 <-> 2 <-> 3 <-> 4 <-> 5
head := CreateNewNode(1)
node_2 := CreateNewNode(2)
node_3 := CreateNewNode(3)
node_4 := CreateNewNode(4)
node_5 := CreateNewNode(5)
head.Next = node_2
node_2.Prev = head
node_2.Next = node_3
node_3.Prev = node_2
node_3.Next = node_4
node_4.Prev = node_3
node_4.Next = node_5
TraverseDoublyLinkedList(head)
}
运行该程序:
$ go run main.go
1 <-> 2 <-> 3 <-> 4 <-> 5
扩展功能
双链表可以扩展多种功能,以下是一些常见的操作:
链表长度
计算链表长度的函数如下:
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 指针,将目标节点从链表中移除。删除方式包括:
- 删除最后的节点
- 删除第一个节点
- 在节点之间删除
反转双链表
反转双链表的过程包括:
- 将 head 指针指向最后一个节点
- 将最后一个节点的 prev_node 指针设为 NULL
- 将第一个节点的 next_node 指针设为 NULL
- 调整各个节点的 next_node 和 prev_node 指针,使其指向正确的位置
总结
与单链表相比,双链表提供了更多的便利性,可以从任何方向遍历,更方便地进行插入和删除操作。但同时也带来了额外的存储开销,因为每个节点需要维护两个指针。
热门推荐
上海嘉定区开展水闸信息系统应急演练,为防汛备汛提供科技支撑
黄杨盆景养护全攻略:从选购到日常管理的实用指南
元宇宙是什么?一文彻底带你看懂什么是元宇宙?
手机保护壳的质量标准是什么?
棉被清洁保养大解析:四大款式棉被的保養方式
漫步澳门历史城区,聆听岁月的低语
产业加速蓄力,山东文旅下半年多期待
高血压患者的豆腐膳食选择
纸尿裤选择指南!
蓝色有哪几种蓝色?常见蓝色种类及其特点
头发干枯是什么导致的?如何护理头发?
土耳其电商市场前景(土耳其跨境电商平台汇总)
辩证看待地方性写作风潮的价值
泸沽湖水质如何?能否直接饮用?当地居民的饮用水来源是什么?
法定节假日限时段停车位管理的规定与实施
印度棱背龟的饲养方法(宠物爱好者必读的饲养指南)
碘伏棉棒的正确用法图解
滇池绿道外海段 网红美景逛不完
食管镜检查痛苦吗?
如何申请劳动仲裁最有效
貂:鼬科小型肉食性哺乳动物
漫画《犬夜叉》:寻找四魂之玉的碎片,人与妖的奇幻之旅
喜用神按属相还是按日柱选择,喜用神对应的心性特点
《怪物猎人荒野》重弩新手操作教学
著作权许可协议模板(通用版)
如何清洗床垫?教你快速去除污渍、异味和螨虫!
2024年国家网络安全宣传周 | 网络安全为人民 网络安全靠人民
离婚财产保全需要交多少钱?婚前财产加女方名有用吗?
掌握职场沟通技巧必看书籍推荐:《经理人参阅:有效沟通》
血脂偏稠的情况下能否食用豆制品