链表简单实现(增删查改)

链表

关于链表的原理已经有一篇链表文章写的很详细了,这篇文章主要侧重于代码的实现,主要使用go实现。

单链表实现

package Listtype listNode struct {val  intnext *listNode
}func newNode(val int) *listNode {node := new(listNode)node.val = valnode.next = nilreturn node
}// NewList 初始化一个不带头结点的链表
func NewList(vals []int) *listNode {var fistNode *listNodevar curNode *listNodefor _, v := range vals {node := newNode(v)if curNode == nil {fistNode = nodecurNode = fistNodecontinue}curNode.next = nodecurNode = curNode.next}return fistNode
}// FistAdd 头插
func FistAdd(fistNode *listNode, val int) *listNode{if fistNode == nil {return fistNode}node := newNode(val)node.next = fistNodereturn node
}// LastAdd 尾插
func LastAdd(fistNode *listNode, val int)  {if fistNode == nil {return}curNode := fistNodefor curNode.next != nil {curNode = curNode.next}node := newNode(val)curNode.next = nodereturn
}// IndexValAdd 在第一个指定值后插入,若没有,在链表尾部插入
// fistNode 链表第一个节点, indexVal 目标节点值, val 新节点值
func IndexValAdd(fistNode *listNode, indexVal, val int) {if fistNode == nil {return}curNode := fistNodefor curNode.next != nil && curNode.val != indexVal {curNode = curNode.next}node := newNode(val)nextNode := curNode.nextnode.next = nextNodecurNode.next = nodereturn
}// ChangVal 更改目标节点值,若没有,不做改动
// fistNode 链表第一个节点, indexVal 目标节点值, val 目标值
func ChangVal (fistNode *listNode,  indexVal, tarVal int)  {if fistNode == nil {return}curNode := fistNodefor curNode != nil && curNode.val != indexVal {curNode = curNode.next}// 判断是走到最后都没有找到对应值还是找到对应值if curNode == nil{return}curNode.val = tarValreturn}// DelNode 删除指定节点,若没有则不删除
func DelNode(fistNode *listNode, indexVal int)  {if fistNode == nil {return}curNode := fistNode// 查找要删除节点的前一个节点for curNode.next != nil  {nextNode := curNode.nextif nextNode.val == indexVal {break}curNode = curNode.next}if curNode.next == nil {return}nextNode := curNode.nextcurNode.next = nextNode.next}// Show 不带头节点查
func Show(node *listNode) []int {if node == nil {return []int{}}valSlice := make([]int, 0, 4)curNode := nodefor curNode != nil {valSlice = append(valSlice, curNode.val)curNode = curNode.next}return valSlice
}

验证代码

package mainimport ("Data/List""fmt"
)func main() {// 初始化一个链表fistNode := List.NewList([]int{1, 2, 3, 4, 5})fmt.Println("初始化一个链表 :",List.Show(fistNode))// 对链表进行头插fistNode = List.FistAdd(fistNode, 0)fmt.Println("对链表进行头插 0 :",List.Show(fistNode))// 对链表进行尾插List.LastAdd(fistNode, 6)fmt.Println("对链表进行尾插 6 :",List.Show(fistNode))// 删除指定节点List.DelNode(fistNode, 3)fmt.Println("删除指定节点 3 :",List.Show(fistNode))List.DelNode(fistNode, 3)fmt.Println("删除指定节点 3 :",List.Show(fistNode))List.DelNode(fistNode, 3)fmt.Println("删除指定节点 7 :",List.Show(fistNode))// 在第一个指定值后插入List.IndexValAdd(fistNode, 4, 41)fmt.Println("在第一个指定值后插入,若没有,在链表尾部插入 4 41 :",List.Show(fistNode))List.IndexValAdd(fistNode, 7, 42)fmt.Println("在第一个指定值后插入,若没有,在链表尾部插入 7 42 :",List.Show(fistNode))// 更改目标节点值List.ChangVal(fistNode, 4, 40)fmt.Println("更改目标节点值 4 40 :",List.Show(fistNode))List.ChangVal(fistNode, 7, 43)fmt.Println("更改目标节点值 7 43 :",List.Show(fistNode))
}

效果图

在这里插入图片描述

循环链表实现

package Listimport "fmt"func newCircleNode(val int) *listNode {node := new(listNode)node.val = valnode.next = nodereturn node
}func NewCircleList(vals []int) *listNode {var fistNode *listNodevar curNode *listNodefor _, v := range vals {if curNode == nil {fistNode = newCircleNode(v)curNode = fistNodecontinue}node := newCircleNode(v)node.next = fistNodecurNode.next = nodecurNode = curNode.next}return fistNode
}func isLastNode(fistNode *listNode, node *listNode) bool {return node.next == fistNode
}// CircleFistAdd 头插
func CircleFistAdd(fistNode **listNode, val int)  {if fistNode == nil {return}curNode := *fistNodefor !isLastNode(*fistNode, curNode) {curNode = curNode.next}node := newCircleNode(val)curNode.next = nodenode.next = *fistNode*fistNode = node
}// CircleLastAdd 尾插
func CircleLastAdd(fistNode *listNode, val int) {if fistNode == nil {return}curNode := fistNodefor !isLastNode(fistNode, curNode) {curNode = curNode.next}node := newCircleNode(val)node.next = fistNodecurNode.next = node}// CircleIndexValAdd 在第一个指定值后插入,若没有,在链表尾部插入
func CircleIndexValAdd(fistNode *listNode, indexVal,val int) {if fistNode == nil {return}curNode := fistNodefor !isLastNode(fistNode, curNode) && curNode.val != indexVal {curNode = curNode.next}node := newCircleNode(val)node.next = curNode.nextcurNode.next = node}// CircleChangVal 更改目标节点值,若没有,不做改动
func CircleChangVal(fistNode *listNode, indexVal, tarVal int) {if fistNode == nil {return}curNode := fistNodefor curNode.val != indexVal && !isLastNode(fistNode, curNode)  {curNode = curNode.next}if curNode.val == indexVal {curNode.val = tarValreturn}fmt.Printf("节点 %d 不存在\n", indexVal)
}// CircleDelNode 删除指定节点,若没有则不删除
func CircleDelNode(fistNode *listNode, indexVal int) {if fistNode == nil {return}curNode := fistNodefor curNode.next.val != indexVal && !isLastNode(fistNode, curNode)  {curNode = curNode.next}if curNode.next.val == indexVal {curNode.next = curNode.next.nextreturn}fmt.Printf("没有该节点 %d \n", indexVal)}// CircleShow 查看链表
func CircleShow(fistNode *listNode) {if fistNode == nil {return}curNode := fistNodefor {if isLastNode(fistNode, curNode) {fmt.Printf("val:%d next:%d", curNode.val, curNode.next.val)break}fmt.Printf("val:%d next:%d -> ", curNode.val, curNode.next.val)curNode = curNode.next}fmt.Println()
}

验证代码

package mainimport ("Data/List""fmt"
)func main() {// 初始化一个环形链表circleFistNode := List.NewCircleList([]int{1, 2, 3})fmt.Println("初始化一个链表 :")List.CircleShow(circleFistNode)// 对链表进行头插List.CircleFistAdd(&circleFistNode, 0)fmt.Println("对链表进行头插  0:")List.CircleShow(circleFistNode)// 对链表进行尾插List.CircleLastAdd(circleFistNode, 4)fmt.Println("对链表进行尾插 4 :")List.CircleShow(circleFistNode)// 删除指定节点fmt.Println("删除指定节点 3 :")List.CircleDelNode(circleFistNode, 3)List.CircleShow(circleFistNode)fmt.Println("删除指定节点 3 :")List.CircleDelNode(circleFistNode, 3)List.CircleShow(circleFistNode)fmt.Println("删除指定节点 7 :")List.CircleDelNode(circleFistNode, 7)List.CircleShow(circleFistNode)// 在第一个指定值后插入circleFistNode = List.NewCircleList([]int{1, 2, 3})fmt.Println("初始化一个链表 :")List.CircleShow(circleFistNode)List.CircleIndexValAdd(circleFistNode, 2, 41)fmt.Println("在第一个指定值后插入,若没有,在链表尾部插入 2 41 :")List.CircleShow(circleFistNode)List.CircleIndexValAdd(circleFistNode, 7, 42)fmt.Println("在第一个指定值后插入,若没有,在链表尾部插入 7 42 :")List.CircleShow(circleFistNode)// 更改目标节点值circleFistNode = List.NewCircleList([]int{1, 2, 3, 4})fmt.Println("初始化一个链表 :")List.CircleShow(circleFistNode)fmt.Println("更改目标节点值 3 40 :")List.CircleChangVal(circleFistNode, 3, 40)List.CircleShow(circleFistNode)fmt.Println("更改目标节点值 7 43 :")List.CircleChangVal(circleFistNode, 7, 43)List.CircleShow(circleFistNode)//
}

效果图

在这里插入图片描述

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

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

相关文章

今天不发技术文,发点粉丝福利

一、资料 1、100套小编购买的简历模板(部分截图) 2、1000套精品PPT模板(部分截图) 3、大数据-学习资料(1.3G 硬核PDF,官方指南) 4、python学习全集 5、Java基础、高级和面试资料 6、大数据-行业…

剑指 Offer 35. 复杂链表的复制(哈希/衍生拆分图解)

题目描述 请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。 题目分析 题中每个节点新增了 random 指针,指向链表…

自动驾驶技术发展的5个阶段和现状

来源:智车科技摘要:自动驾驶的级别从L1到L5(SAE),清晰而直观,是大家讨论自动驾驶行业的一个基准。但是,它也很容易误导人。让人以为自动驾驶的技术会一级一级获得突破,最终迎来一辆L…

❤『知识集锦』一文搞懂mysql索引!!(建议收藏)

作者:不吃西红柿 简介:CSDN博客专家、蓝桥签约作者、大数据领域优质创作者。 以我的资历和文凭,将来这个城市的大街,都归我扫。 【系列课程介绍】 『面试知识集锦』系列课程包括以下20个系列,超过100篇文章。每篇文章…

AI芯片的过去、现在与未来

来源:华尔街见闻摘要:AI芯片似乎没能表现得比人类更智能,但它们的学习能力很强,未来可以变得更聪明。算法和芯片系统的设计都可以进步,这需要AI芯片具备更高级的记忆系统和连接机制,以及承载深度学习数据流…

链表(图文详解)

链表的概念 链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。   链表的结构是多式多样的,当时通常用的也就是两种:   无头单向非循环列表:结构简单&…

sql join中on条件后接and和where

目录 场景1:left join on a.xx b.xx and a.xx2 aa 场景2:left join on a.xx b.xx and b.xx2 aa 场景3:left join on a.xx b.xx where b.xx2 aa 场景4:inner join on a.xx b.xx where a.xx2 aa 场景5:…

❤「和平精英」被python爬虫了?看看你最适合什么配件!❤

作者简介:不吃西红柿,CSDN博客专家、蓝桥签约作者。 困难像弹簧,你弱它就强,你强它更强。 求点赞、求关注 写作目的: 1、练习爬虫技术; 2、深入了解和平精英枪械属性,提高吃鸡概率。 一、爬前…

(相当全面)node.js 初体验

转载自:http://www.cnblogs.com/Darren_code/archive/2011/10/31/nodejs.html 最近写的文章收到许多朋友的反馈,感谢大家的支持和建议,让我对坚持写博客充满热情,一个月一篇文章确实有点少,所以以后尽力多做分享&#…

深度 | 激光雷达独角兽Quanergy的危急时刻

来源:网易智能编译摘要:全球知名的激光雷达制造商 Quanergy 最近陷入了麻烦之中。早在2014年,Quanergy公司就发现自己正身处于一场对自动驾驶汽车突如其来的狂热之中。Quanergy公司制造了激光雷达技术,这是一种将激光反射到物体上…

❤ 就这?TypeScript其实并不难!(建议收藏)❤

🎈 作者:不吃西红柿 🎈 简介:CSDN博客专家🏆、蓝桥签约作者、Python领域优质创作者、信息技术智库公众号创建者✌。技术交流、面试刷题尽管关注咨询我。 热门专栏推荐: 🥇 知识集锦专栏&…

EntityModelStudio系列教程2--静态建模之实体模型设计

在EMStudio中静态建模的概念和内容是来自于UML标准的,所以EMStudio提供的静态建模的设计能力是完全可以满足开发者的设计要求的。但是与UML标准比较,EMStudio中的静态建模还存在两个不同的特色: 1. 类与实体的概念是一致的 也就是说&#xff…

前沿科技山雨欲来,四大领域存创新机会

来源:北极光创投摘要:最近,北极光创投董事总经理杨磊,发表了《前沿科技山雨欲来》的主题演讲,他认为目前全球正处于前沿科技爆发前夜,他看好计算构架变革、移动终端、机器人、生物科技与IT融合四大领域的创…

工业机器人发展现状:硬件制造大同小异,视觉感知绘新蓝图

来源 :亿欧摘要:8月15日-8月19日,在北京亦庄国际会展中心举办了为期五天的2018世界机器人大会。小编认为,国内工业机器人的总体水平在未来长期时间将处于稳定上升区,而两极分化趋势愈显。8月15日-8月19日,在…

[C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现

本专题主要介绍下如何实现UDP广播的程序,下面就直接介绍实现过程和代码以及运行的结果。 一、程序实现 UDP广播程序的实现代码: using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.W…

我们离得开美国的软件和硬件吗?

来源:网易科技摘要:据报道,你当然可以淘汰很多美国产品,但你可能也会因此放弃许多令人惊叹的功能。据报道,你当然可以淘汰很多美国产品,但你可能也会因此放弃许多令人惊叹的功能。例如,超过10亿…

❤️❤️❤️【资料免费领取】简历模板、职场PPT模板、硬核学习资料+PDF资料(Java、Python、大数据、机器学习)❤️❤️❤️

🍅【领取方法】 长按识别二维码,回复【资料】领取 目录 1、100套小编购买的简历模板(部分截图) 2、1000套精品PPT模板(部分截图) 3、大数据-学习资料(1.3G 硬核PDF,官方指南&…

超20亿!2018年国家自然科学基金(重点项目)出炉!

来源:青塔摘要:8月16日,2018年国家自然科学基金评审结果正式揭晓。8月16日,2018年国家自然科学基金评审结果正式揭晓。继昨天发布了2018年国家优青项目各单位的立项情况后,青塔今天又整理重点项目的立项情况和完整名单…

❤️ 珊姐带你学JavaScript:数组和函数 (万文建藏)❤️

🍅 作者:阿珊 🍅 简历模板、职场PPT模板、技术交流尽管关注私聊我。 🍅 期许:欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 热门专栏推荐: 🥇 大数据集锦…

产业|中国电子学会发布《机器人十大新兴应用领域(2018-2019年)》

来源: 中国电子学会8月19日,2018世界机器人大会胜利闭幕,闭幕式上中国电子学会发布了《发布机器人十大新兴应用领域(2018-2019年)》。当前,全球正在经历科技、产业、资本高度耦合、深度迭加的新一轮变革&am…