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

单向链表实现lru

package mainimport "fmt"func main() {// 实现一个lru 淘汰算法// linked 结构体// node 节点 : data prev next// 更新lru// 如果没有满// 将新的数据加入到头结点// 队满 : 删除尾结点// 将新数据加入头结点linkedObj := getLinked[int](5)linkedObj.insert(6)linkedObj.insert(5)linkedObj.insert(4)linkedObj.insert(3)linkedObj.insert(2)linkedObj.insert(1)linkedObj.insert(0)//fmt.Printf("当前节点: %+v\n", linkedObj)fmt.Printf("当前节点: %+v\n", linkedObj.head.next.data)linkedObj.foreach()
}type linked[T int | string | map[string]string] struct {head   *node[T]length intlimit  int
}type node[T int | string | map[string]string] struct {data Tnext *node[T]
}func getLinked[T int | string | map[string]string](limit int) *linked[T] {headNode := &node[T]{}return &linked[T]{head:   headNode,length: 0,limit:  limit,}
}func createNode[T int | string | map[string]string](data T) *node[T] {return &node[T]{data: data,next: nil,}
}func (l *linked[T]) insert(data T) bool {newNode := createNode(data)headNode := l.head.nextnewNode.next = l.head.nextl.head.next = newNodeif l.length == l.limit {prevNode := headNodefor headNode.next != nil {prevNode = headNodeheadNode = headNode.next}prevNode.next = nil} else {l.length++}return true
}func (l *linked[T]) foreach() {headNode := l.head.nextfor headNode.next != nil {headNode = headNode.nextfmt.Printf("当前节点: %+v\n", headNode.data)}
}

双向链表

package mainimport "fmt"func main() {// 实现一个双向循环链表linkedObj := getLinked[int](5)linkedObj.headInsert(6)linkedObj.headInsert(5)linkedObj.headInsert(4)linkedObj.headInsert(3)linkedObj.headInsert(2)linkedObj.headInsert(1)linkedObj.headInsert(0)//fmt.Printf("当前节点: %+v\n", linkedObj)//fmt.Printf("当前节点: %+v\n", linkedObj.head.next.data)linkedObj.headForeach()//linkedObj.tailForeach()
}type linked[T int | string | map[string]string] struct {head   *node[T]length intlimit  int
}type node[T int | string | map[string]string] struct {data Tnext *node[T]prev *node[T]
}func getLinked[T int | string | map[string]string](limit int) *linked[T] {return &linked[T]{head:   nil,length: 0,limit:  limit,}
}func createNode[T int | string | map[string]string](data T) *node[T] {return &node[T]{data: data,next: nil,prev: nil,}
}// 从头部插入
func (l *linked[T]) headInsert(data T) bool {newNode := createNode(data)if l.head == nil {l.head = newNodel.head.next = newNodel.head.prev = newNodel.length++return true}// 原头结点currentNode := l.headheadNode := currentNodel.head = newNodenewNode.next = currentNodecurrentNode.prev = newNode// 找到尾结点for {if currentNode.next == headNode {break}currentNode = currentNode.next}if l.length >= l.limit {currentNode.prev.next = l.headl.head.prev = currentNode.prev} else {l.head.prev = currentNodel.length++}return true
}func (l *linked[T]) delete(node *node[T]) {}// 从头部遍历
func (l *linked[T]) headForeach() {headNode := l.headfmt.Printf("从头结点遍历:\n")for {fmt.Printf("当前节点: %+v\n", headNode.data)if headNode.next == l.head {break}headNode = headNode.next}
}// 从尾部遍历
func (l *linked[T]) tailForeach() {endNode := l.head.prevfmt.Printf("从尾结点遍历:\n")for {fmt.Printf("当前节点: %+v\n", endNode.data)if endNode.prev == l.head.prev {break}endNode = endNode.prev}
}

双向循环链表

package mainimport "fmt"func main() {// 实现一个lru 淘汰算法// 双向循环链表// linked 结构体// node 节点 : data prev next// 更新lru// 如果没有满// 将新的数据加入到头结点// 队满 : 删除尾结点// 将新数据加入头结点linkedObj := getLinked[int](5)linkedObj.headInsert(6)linkedObj.headInsert(5)linkedObj.headInsert(4)linkedObj.headInsert(3)linkedObj.headInsert(2)linkedObj.headInsert(1)linkedObj.headInsert(0)//fmt.Printf("当前节点: %+v\n", linkedObj)//fmt.Printf("当前节点: %+v\n", linkedObj.head.next.data)linkedObj.headForeach()linkedObj.tailForeach()
}type linked[T int | string | map[string]string] struct {head   *node[T]length intlimit  int
}type node[T int | string | map[string]string] struct {data Tnext *node[T]prev *node[T]
}func getLinked[T int | string | map[string]string](limit int) *linked[T] {return &linked[T]{head:   nil,length: 0,limit:  limit,}
}func createNode[T int | string | map[string]string](data T) *node[T] {return &node[T]{data: data,next: nil,prev: nil,}
}// 从头部插入
func (l *linked[T]) headInsert(data T) bool {newNode := createNode(data)if l.head == nil {l.head = newNodel.length++newNode.next = newNodenewNode.prev = newNodereturn true}currentNode := l.head// 头结点位置headNodePos := l.headl.head = newNodenewNode.next = currentNodecurrentNode.prev = newNode// 找尾结点for {if currentNode.next == headNodePos {break}currentNode = currentNode.next}if l.length >= l.limit {currentNode.prev.next = newNodenewNode.prev = currentNode.prev} else {currentNode.next = newNodenewNode.prev = currentNodel.length++}return true
}func (l *linked[T]) delete(node *node[T]) {}// 从头部遍历
func (l *linked[T]) headForeach() {headNode := l.headheadNodPos := headNodefmt.Printf("从头结点遍历:\n")for {fmt.Printf("当前节点: %+v\n", headNode.data)if headNode.next == headNodPos {break}headNode = headNode.next}
}// 从尾部遍历
func (l *linked[T]) tailForeach() {endNode := l.headendNodePos := endNodefmt.Printf("从尾结点遍历:\n")for {fmt.Printf("当前节点: %+v\n", endNode.prev.data)if endNode.prev == endNodePos {break}endNode = endNode.prev}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/181180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python实现视频人脸检测识别功能

目录 一、引言 二、人脸检测识别技术概述 三、Python实现视频人脸检测识别功能的步骤 1、安装相关库和工具 2、加载视频文件 3、人脸检测和识别 4、保存视频结果 四、实验结果和讨论 五、结论 一、引言 在当今社会,人脸检测识别技术在安全监控、人机交互、…

全网日志智能聚合及问题根因分析

1 日志关联分析的挑战 随着各行各业数字化转型的不断深入,网络承载了人们日常生活所需的政务、金融、娱乐等多方面的业务系统,已经成为影响社会稳定运行、关系国计民生的重要基础设施资源。哪怕网络发生及其微小的故障,也可能带来难以估量的…

Java基础之原码,反码,补码,位运算符

文章目录 前言一、二进制在运算中介绍二、原码&#xff0c;反码&#xff0c;补码&#xff08;针对有符号的&#xff09;三、位运算符按位与&按位或 |按位异或 ^按位取反 ~算术右移>>算术左移<<逻辑右移>>> 总结 前言 原码&#xff0c;反码&#xff0…

【shell】文本三剑客之sed详解

目录 一、sed简介&#xff08;行编辑器&#xff09; 二、基本用法 三、sed脚本格式&#xff08;匹配地址 脚本命令&#xff09; 1、不给地址&#xff0c;那么就是针对全文处理 2、单地址&#xff0c;表示#&#xff0c;指定的行&#xff0c;$表示最后一行&#xff0c;/pattt…

牛客算法题 HJ100 等差数列 golang语言实现

算法题目 HJ100 等差数列 描述 等差数列 2&#xff0c;5&#xff0c;8&#xff0c;11&#xff0c;14。。。。 &#xff08;从 2 开始的 3 为公差的等差数列&#xff09; 输出求等差数列前n项和数据范围&#xff1a; 1 ≤ &#xfffd; ≤ 10001≤n≤1000 输入描述&#xff…

python与机器学习1,机器学习的一些基础知识概述(完善ing)

目录 1 AI ,ML,DL,NN 等等概念分类 1.1 人工智能、机器学习、深度学习、神经网络之间的关系&#xff1a; 1.2 人工智能的发展 2 ML机器学习的分类&#xff1a;SL, USL,RL 2.1 机器学习的分类 2.2 具体的应用举例 2.3 数据分类 3 关于阈值θ和偏移量b的由来 4 不同的激…

qt使用qproperty在css中设置自定义的qobject类属性

在Qt的CSS样式表中使用 qproperty 来赋值&#xff0c;首先需要在类的定义中使用 Q_PROPERTY 宏声明属性&#xff0c;并提供相应的 getter 和 setter 函数。 // MyWidget.h#ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget>class MyWidget : public QWidget {Q_O…

网站定制开发对企业的好处|软件app小程序搭建

网站定制开发对企业的好处|软件app小程序搭建 在当今数字化的时代&#xff0c;拥有一个专属于自己企业的网站已经成为了一种趋势。而与此同时&#xff0c;网站定制开发作为一种针对企业需求量身定制的解决方案&#xff0c;也越来越受到企业的关注和青睐。那么&#xff0c;网站定…

SSL证书实惠品牌——JoySSL

随着互联网的普及和发展&#xff0c;网络安全问题日益严重。为了保护网站数据的安全&#xff0c;越来越多的网站开始使用SSL证书。JoySSL证书作为一款高性价比的SSL证书&#xff0c;受到了广泛的关注和好评。 目前市面上主流的证书基本上都是国外证书&#xff0c;也就是说你在验…

09-详解JSR303规范及其对应的校验框架的使用

JSR303规范 校验注解 前端请求后端接口时传输的参数在Controller和Service中都要校验但分工不同,因为你无法保证Service接口一定是由Controller层调用 Controller中的校验代码是通用的: 主要是校验请求参数的合法性&#xff0c;包括必填项校验、数据格式校验(如日期格式) Se…

HarmonyOS 后台任务管理开发指南上线!

为什么要使用后台任务&#xff1f;开发过程中如何选择合适的后台任务&#xff1f;后台任务申请时存在哪些约束与限制&#xff1f; 针对开发者使用后台任务中的疑问&#xff0c;我们上线了概念更明确、逻辑结构更清晰的后台任务开发指南&#xff0c;包含具体的使用场景、详细的开…

js实现鼠标拖拽

目录 css代码 html代码 js代码 完整代码 效果图&#xff1a; 需求&#xff1a; 鼠标在图片内按下时 图片可以跟随盒子动 鼠标弹起图片停下来 如果图片在box的盒子里面时鼠标弹起了 就把图片展示在box里面 并且让图片回到起始位置 css代码 .div {width: 100px;height: 10…

五分钟 k8s 实战-应用探针

Probe.png 今天进入 kubernetes 的运维部分&#xff08;并不是运维 kubernetes&#xff0c;而是运维应用&#xff09;&#xff0c;其实日常我们大部分使用 kubernetes 的功能就是以往运维的工作&#xff0c;现在云原生将运维和研发关系变得更紧密了。 今天主要讲解 Probe 探针相…

立哥尖端技术-室内定位语音无线溯源国家通信核心网

背景技术 VoLTE(长期演进语音承载)是目前运营商最广泛使用的高清语音通话技术&#xff0c;其通 过无线小区信息(cell ‑ id)来进行溯源工作(在移动网信令传送及话单中&#xff0c;标识了明确的无 线小区信息&#xff0c;以满足溯源要求)&#xff0c;该方法溯源精度为小区级(…

C语言——I /深入理解指针(三)

一、字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 char* ; ⼀般使⽤: int main() { char ch w; char *pc &ch; *pc w; return 0; } 还有⼀种使⽤⽅式如下&#xff1a; int main() { const char* pstr "hello bit.";//这⾥是把⼀个字…

jquery 地址四级联级显示 不默认选择

代码效果 <body class"bgca"><img src"./files/joinTooBg.png" style"width: 100%;object-fit: cover;" alt""><!--填写申请资料--><section><div class"zi-liao"><h3 class"zong-h…

鸿蒙应用开发之打包与上架

一、概述 当您开发、调试完HarmonyOS应用/元服务&#xff0c;就可以前往AppGallery Connect申请上架&#xff0c;华为审核通过后&#xff0c;用户即可在华为应用市场获取您的HarmonyOS应用/元服务。 HarmonyOS会通过数字证书与Profile文件等签名信息来保证应用的完整性&#…

污染源在线监控平台设备调试

运行调试&#xff1a; 平台端接收数据端口&#xff1a;20000操作步骤&#xff1a; 、创建tcp client、212协议组包,需要注意的地方已经标红eg: ##0231QN20211014183805619;ST32;CN2011;PW123456;MN888800001;Flag1;CP&&DataTime20211014183730;060-Rtd1.6160,060-Fla…

Vue3中props传参(多种数据类型传参方式)

在Vue3中&#xff0c;props接收的type类型有以下几种&#xff1a; 1. String&#xff1a;字符串类型 2. Number&#xff1a;数字类型 3. Boolean&#xff1a;布尔类型 4. Array&#xff1a;数组类型 5. Object&#xff1a;对象类型 6. Date&#xff1a;日期类型 7. Func…

案例:某旅游文化开发公司的IT设备统一监控

一、背景介绍 某旅游文化开发有限公司&#xff08;以下简称“旅文公司”&#xff09;是一家专注于旅游文化开发的综合性企业。随着公司业务的快速发展&#xff0c;其IT设备数量和复杂性不断增加&#xff0c;这给IT运维和管理带来了挑战。为了提高IT设备的可靠性和稳定性&#x…