golang 实现双向链表

Golang 双链表(Doubly Linked List) 双向链表的每个数据节点包含三个元素:数据、前驱节点的指针、后继节点的指针。头部节点 单向循环链表和单向链表相似,每个数据节点包含数据和后继节点的指针,区别在于最后一个节点的后继节点指针为链表的头部节点,形成一个环。 双向链表的每个数据节点包含三个元素:数据、前驱节点的指针、后继节点的指针。头部节点的前驱指针为NULL, 尾部节点的后继指针为NULL 2.2.2 尾部追加数据 2.2.4 index查找节点数据 2.2.5 从任意位置插入 2.2.6 从头部 阅读详情
package main

//链表节点
type doublLinkeNode struct {
	data interface{}     //节点存在的数据
	pre  *doublLinkeNode //指向上一个节点的指针
	next *doublLinkeNode //指向下一个节点的指针
}

//链表数据结构(两个指针 一个指向头节点、一个指向尾节点 便于可以从两边获取数据)
type doubleLink struct {
	head   *doublLinkeNode //指向头结点
	tail   *doublLinkeNode //指向尾节点
	length int64           //链表长度
}

//初始化链表
func initDoubleLink() (dl *doubleLink) {
	dl = &doubleLink{}
	dl.head = nil
	dl.tail = nil
	dl.length = 0
	return
}

//往链表的头部添加节点
func (this *doubleLink) addLNode(data interface{}) int64 {
	newNode := &doublLinkeNode{data: data}
	if this.length == 0 {
		this.head = newNode
		this.tail = newNode
	} else {
		head := this.head
		newNode.next = head
		head.pre = newNode
		this.head = newNode
	}
	this.length++
	return this.length
}

//往链表尾部添加节点
func (this *doubleLink) addRNode(data interface{}) int64 {
	newNode := &doublLinkeNode{data: data}
	if this.length == 0 {
		this.head = newNode
		this.tail = newNode

	} else {
		tail := this.tail //获取当前链表的尾节点
		tail.next = newNode
		newNode.pre = tail
		this.tail = newNode
	}
	this.length++
	return this.length
}

//遍历链表
func (this *doubleLink) rangeLink() []interface{} {
	if this.length == 0 {
		return nil
	}
	var list []interface{}
	node := this.head
	for {
		list = append(list, node.data)
		if node.next == nil {
			break
		} else {
			node = node.next
		}
	}
	return list
}

//获取某个位置的节点
func (this *doubleLink) getValue(index int64) interface{} {
	if this.length == 0 {
		return nil
	}
	node := this.head
	var count int64
	for {
		if count == index {
			return node.data
		}
		if node.next == nil {
			break
		}
		node = node.next
		count++
	}
	return nil
}

func main() {
	doubleLink := initDoubleLink()
	doubleLink.addRNode(123)
	doubleLink.addRNode(789)
	doubleLink.addRNode(338)
	doubleLink.addLNode(996)
	doubleLink.addRNode(789)
	doubleLink.addRNode("this is string")
	values := doubleLink.rangeLink()
	for _, v := range values {
		fmt.Println("node value:", v)
	}
	var index int64
	index = 1
	fmt.Println("index:", index, " value:", doubleLink.getValue(index))
}

 

Gemini永久会员 Go 语言中的单向链表和双向链表实现 Go 标准库中没有内置的链表实现,但提供了 `container/list` 包实现了双向链表。if list.head == list.tail { // 只有一个节点。- 插入/删除: 双向链表可以更高效(O(1)),特别是从尾部操作。双向链表每个节点包含数据、指向前一个节点的指针和指向下一个节点的指针。- 双向链表: 有指向前一个和后一个节点的指针。单向链表每个节点包含数据和指向下一个节点的指针。- 单向链表: 只有指向下一个节点的指针。# Go 语言中的单向链表和双向链表实现。 阅读详情

相关推荐

go语言实现双向链表(附完整源码)

go语言实现双向链表(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 269

Golang——实现双链表

双链表(Doubly Linked List)是一种链表数据结构,它的每个节点都有两个链接:一个指向前一个节点(如果有的话),另一个指向下一个节点(如果有的话)。这使得双链表在遍历、插入和删除节点时都具有一定的灵活性。双链表和单链表的基本操作有很多相似的。。

qq_61453210的博客 923

国内优秀MES开源框架

一套springboot 开源框架 代码标准规范化。 界面展示 演示地址 http://wangziyangmes.pzzd.xyz 用户名admin 密码123 系统管理 工艺管理 计划管理 物料管理 *用户管理* *工艺路线管理* 工单下达...

q707231019的博客 2万+

golang 实现单向链表(lru)、双向链表、双向循环链表

golang 实现链表

拥的博客 999

IAR编译相同工程生产hex文件checksum不一致问题

IAR Checksum

xqw19891201的博客 1382

先楫HPM6E00EVK EtherCAT从站配置与CIA402 8轴运动控制实战解析

本文详细解析了先楫HPM6E00EVK开发板的EtherCAT从站配置与CIA402 8轴运动控制实战。从环境准备、XML文件配置、代码移植到TwinCAT工程设置,提供了完整的移植指南,帮助开发者实现高效的多轴同步运动控制。

o5p6q的博客 415

双向链表(golang实现)

个人github(包括golang学习笔记、源码):https://github.com/fangguizhen/Notes/blob/master/Golang%E7%9F%A5%E8%AF%86%E7%82%B9.md //单向链表的缺点分析 //1、单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找 //2、单向链表不能自我删除,需要靠辅助节点,而双向链表可以自我删除。 ...

weixin_44079228的博客 681

保姆级教程:手把手教你从NASA Earthdata下载ASTER L2地表温度数据(附shp文件拖拽技巧)

本文提供了一份详细的NASA Earthdata平台ASTER L2地表温度数据下载教程,涵盖账号注册、数据筛选、shp文件拖拽技巧及质量检查等关键步骤。特别适合遥感领域初学者,帮助快速掌握高效获取ASTER L2T数据的方法,适用于城市热岛效应和农业监测等研究。

weixin_30736301的博客 469

Go语言数据结构(一)双向链表

Go语言中list容器定义在"container/list"包中,实现了一个双向链表。本文第一部分总结源码包中的方法,第二部分展示使用list包的常见示例用法以及刷题时的用法。

qq_47997583的博客 1481

K-Means聚类算法 — 算法原理、质心计算、距离度量、聚类效果评价及优缺点

分类知识   分类是根据样本某些属性或某类特征(可以融合多类特征),把样本类型归为已确定的某一类别中。机器学习中常见的分类算法有:SVM(支持向量机)、KNN(最邻近法)、Decision Tree(决策树分类法)、Naive Bayes(朴素贝叶斯分类)、Neural Networks(神经网络法)等。   但当对海量数据进行分类时,为了降低数据满足分类算法要求所需要的预处理代价,往往需要选...

zhf的博客 1万+

K8S搭建(centos)完整版

每个人都有惰性,但不断学习是好好生活的根本,共勉!

感谢阅读 4144

Go语言中的链表与双向链表实现

本文详细介绍了Go语言中链表和双向链表的实现及应用。链表是一种灵活的数据结构,适用于动态数据的管理和顺序查找。文章通过代码实例展示了如何添加节点、遍历链表、查找节点以及计算链表长度。此外,还探讨了双向链表的实现,它允许双向遍历并提供更灵活的插入和删除操作。文章深入解析了这些数据结构的优势与局限,为读者在实际开发中高效使用链表提供了参考。

一个被知识诅咒的人 1761

Win10或Win11电脑找不到以太网网络适配器的解决方法

Win10或Win11电脑找不到以太网网络适配器的解决方法

Robot_PLC_HMI_Automation 651

Go实现双向链表

本文介绍什么是链表,常见的链表有哪些,然后介绍链表这种数据结构会在哪些地方可以用到,以及 Redis 队列是底层的实现,通过一个小实例来演示 Redis 队列有哪些功能,最后通过 Go 实现一个双向链表。 目录 1、链表 1.1 说明 1.2 单向链表 1.3 循环链表 1.4 双向链表 2、redis队列 2.1 说明 2.2 应用场景 2.3 演示 3、Go双向链表 3.1 ...

link_km的博客 687

Echarts - 去掉图表上的横线和竖线

效果图 默认效果: 变为如下图所示效果: 实现方法 官方配置文档:https://echarts.apache.org/zh/option.html#radar.splitLine 在 xAxis yAxis 配置中分别加入以下代码: splitLine: { show:false }

🏆 前端领域优质创作者 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Golang 实现双向链表

Golang 代码: /* 数据结构 双向链表 */ package main import "fmt" // 定义一个双向链表 type DoubleNode struct { no int // 排名 name string // 名字 nickname string // 外号 pre *DoubleNode // 前一个节点 next *DoubleNode // 下一个节点 } // 给双向链表加入一

XPiedPiperX的博客 414

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

php双向链表,双向链表的GO语言实现

一、什么是双向链表和单链表比较,双向链表的元素不但知道自己的下线,还知道自己的上线(越来越像传销组织了)。小煤车开起来,图里面可以看出,每个车厢除了一个指向后面车厢的箭头外,还有一个指向前面车厢的箭头(车头、车尾除外)。车头只有指向后面车厢的箭头,车尾只有指向前面车厢的箭头。二、双向链表与Go的对应结构1、节点我们先把车厢分解开来。每节车厢都由煤炭、车体、拉前车厢绳索、拉后车厢绳索这4部分组成。车...

weixin_35940173的博客 142

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

php 双向链表,Go实现双向链表

本文介绍什么是链表,常见的链表有哪些,然后介绍链表这种数据结构会在哪些地方可以用到,以及 Redis 队列是底层的实现,通过一个小实例来演示 Redis 队列有哪些功能,最后通过 Go 实现一个双向链表。目录1、链表1.1 说明1.2 单向链表1.3 循环链表1.4 双向链表2、redis队列2.1 说明2.2 应用场景2.3 演示3、Go双向链表3.1 说明3.2 实现4、总结5、参考文献1、链...

weixin_29185199的博客 208

Golang 官方实现的双向链表

概述 在go语言中,官方已经替我们实现了一个双向链表,可以用来存储、查找我们的数据,数据类型支持任意类型,其中节点的定义如下: // Element is an element of a linked list. type Element struct { // Next and previous pointers in the doubly-linked list of elements. // To simplify the implementation, internally a list

叶青 1万+

mysql 双向链表_数据结构——Golang实现双向链表

Golang1. 双向链表双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。结构如下图:image.png2. Golang 实现2.1. 相关结构体首先需要先定义一下链表相关的结构,DoubleObject用于每个节点的数据,为interface{}结构,DoubleNod...

weixin_42324002的博客 215

go list指针_Go实现双向链表

本文介绍什么是链表,常见的链表有哪些,然后介绍链表这种数据结构会在哪些地方可以用到,以及 Redis 队列是底层的实现,通过一个小实例来演示 Redis 队列有哪些功能,最后通过 Go 实现一个双向链表。Go 双向链表目录1、链表1.1 说明1.2 单向链表1.3 循环链表1.4 双向链表2、redis队列2.1 说明2.2 应用场景2.3 演示3、Go双向链表3.1 说明3.2 实现4、总结5、...

weixin_42336892的博客 228

【GoLang】3、基于虚拟头尾节点快速实现双向链表

v2 版本确实是简单易写不易错,且引入了 头尾 的虚拟节点后,在头插、尾插、头删、尾删等边界情况下都需要再特殊考虑了。同时值得一提的是,Go 官方库在一开始其实就支持 list这个数据结构了,且代码写的也十分精简,优雅。几乎是在 v2 版本上的进一步升级,十分值得学习和使用!

Y-puyu 的博客 583

Go 简单实现双向链表

一点点笔记,以便以后翻阅。

小印丶的笔记 378

双向链表的GO语言实现

一、什么是双向链表 和单链表比较,双向链表的元素不但知道自己的下线,还知道自己的上线(越来越像传销组织了)。小煤车开起来,图里面可以看出,每个车厢除了一个指向后面车厢的箭头外,还有一个指向前面车厢的箭头(车头、车尾除外)。车头只有指向后面车厢的箭头,车尾只有指向前面车厢的箭头。 二、双向链表与Go的对应结构 1、节点 我们先把车厢分解...

weixin_34293911的博客 190

go语言实现双向链表

``` package main /* 双向链表结构体*/ type DuLNodestruct{ valinterface{} prefix *DuLNode// 前一个节点 rear *DuLNode// 后一个节点 } /* 初始化双向链表*/ func (L *DuLNode) IninDul(...

weixin_33928467的博客 269

go 队列&栈(双向链表实现)

本篇记录一下go语言自己实现的队列&栈。 本人的情况是这样的,上学的时候用的C++,所以秋招也用的C++,结果签的工作是用go的。。。 用C++的人都知道标准模板库,比如queue,stack这些,用起来很方便,但是go是不提供这些的,所以对于我来说,感觉很不方便,于是乎就想自己写个队列和栈。 在网上搜了搜,实现队列和栈一般有两种方法,第一种用slice,我看leetcode上一些题...

djqueen的博客 2354
上一篇: hashmap的golang实现
下一篇: golang的路由数据结构-基数树radix
phpduang
博客等级 码龄10年 9粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值