Go语言实现单链表

博主最近在学习Go语言,所以打算更新一期Go语言版本的数据结构。这篇文章将的是Go语言如何实现单链表。

文章目录

  • 前言
  • 一、个人见解,为什么学GO?
  • 二、Go语言实现单链表
    • 1.创建节点
    • 2.通过数组创建一个单链表
    • 3.遍历单链表
    • 4.单链表插入操作
      • 4.1 伪代码
      • 4.2尾部插入
      • 4.3 指定位置插入
    • 5.删除操作
      • 5.1 伪代码
      • 5.2 代码实现
    • 5.查找操作
    • 6.最终的代码
  • 总结


前言

提示:Go语言和C语言有很多类似的地方,有C的基础学Go能非常快上手,会C++会更快:

单链表的操作有创建一个链表通过数组,遍历单链表,尾部插入,指定位置插入,删除指定位置的元素,查找指定的节点等。


一、个人见解,为什么学GO?

博主是在某个厂里面实习,所以打算开拓第二语言,我第一门语言是Java,学习GO主要是因为兴趣或者说想更深入底层。如果你也想增加一门新语言,GO或Python都行,看个人选择和方向。

二、Go语言实现单链表

1.创建节点

代码如下(示例):

package main
import "fmt"
//单链表
type Node struct {
	//数据域
	Data int
	//指针域
	Next *Node
}

2.通过数组创建一个单链表

代码如下(示例):

//创建一个链表通过数组, 首字母小写表示private
func createLikedList(arr []int) *Node {
	//创建头指针
	head := Node{}
	//临时指针
	p := &head
	//循环遍历,_表示跳过接收该参数
	for _, v := range arr {
		//创建新的节点
		node := Node{Data: v, Next: nil}
		p.Next = &node
		p = p.Next
	}
	return &head
}

注意的是Go语言返回值是写在后面的,并且GO语言是可以返回临时变量的,与C++不同。


3.遍历单链表

//遍历单链表
func (node Node) printLikedList() {
	p := &node
	for ; p != nil; p = p.Next {
		fmt.Print(p.Data, "->")
	}
	//换行
	fmt.Println()
}

4.单链表插入操作

4.1 伪代码

在这里插入图片描述

4.2尾部插入

//插入操作 -> 尾部插入
func (node *Node) tailInsert(element Node) {
	if node == nil {
		fmt.Println("Node is empty, Not Get Value....")
		return
	}
	//设置临时指针, 找到最后一个节点
	p := node
	for ; p.Next != nil; p = p.Next {
	}
	//将数据插入到末尾
	p.Next = &element
}

4.3 指定位置插入

//插入操作 -> 指定位置插入
func (node *Node) insertByIndex(index int, element Node) bool {
	if node == nil {
		fmt.Println("node is nil, please you notice....")
		return false
	}
	//设置临时指针
	p := node
	q := &element
	//计数器
	count := 0
	for ; p != nil; p = p.Next {
		//如果index等于count, 就需要插入
		if count == index {
			q.Next = p.Next
			p.Next = q
			//停止循环
			return true
		}
		count++
	}
	if index > count {
		fmt.Println("index out of range.....")
	}
	return false
}

5.删除操作

5.1 伪代码

在这里插入图片描述

5.2 代码实现

//删除操作 -> 删除指定位置的元素
func (node *Node) deleteByIndex(index int) bool {
	if node == nil || index < 0 {
		fmt.Println("node is nil or index < 0, please you notice....")
		return false
	}
	//计数器
	count := 0
	//临时指针
	p := node
	for ; p != nil; p = p.Next {
		//查找index位置的元素
		if count == index {
			p.Next = p.Next.Next
			return true
		}
		count++
	}
	if count < index {
		fmt.Println("index out of range.....")
	}
	return false
}

5.查找操作

//查找操作 -> 查找指定的节点
func (node *Node) findElementByValue(value int) (int, bool) {
	//创建一个临时节点
	p := node
	count := 0
	for ; p != nil; p = p.Next {
		if value == p.Data {
			return count - 1, true
		}
		count++
	}
	return -1, false
}

6.最终的代码

package main

import "fmt"

//单链表
type Node struct {
	//数据域
	Data int
	//指针域
	Next *Node
}

//创建一个链表通过数组
func createLikedList(arr []int) *Node {
	//创建头指针
	head := Node{}
	//临时指针
	p := &head
	//循环遍历
	for _, v := range arr {
		//创建新的节点
		node := Node{Data: v, Next: nil}
		p.Next = &node
		p = p.Next
	}
	return &head
}

//遍历单链表
func (node Node) printLikedList() {
	p := &node
	for ; p != nil; p = p.Next {
		fmt.Print(p.Data, "->")
	}
	//换行
	fmt.Println()
}

//插入操作 -> 尾部插入
func (node *Node) tailInsert(element Node) {
	if node == nil {
		fmt.Println("Node is empty, Not Get Value....")
		return
	}
	//设置临时指针, 找到最后一个节点
	p := node
	for ; p.Next != nil; p = p.Next {
	}
	//将数据插入到末尾
	p.Next = &element
}

//插入操作 -> 指定位置插入
func (node *Node) insertByIndex(index int, element Node) bool {
	if node == nil {
		fmt.Println("node is nil, please you notice....")
		return false
	}
	//设置临时指针
	p := node
	q := &element
	//计数器
	count := 0
	for ; p != nil; p = p.Next {
		//如果index等于count, 就需要插入
		if count == index {
			q.Next = p.Next
			p.Next = q
			//停止循环
			return true
		}
		count++
	}
	if index > count {
		fmt.Println("index out of range.....")
	}
	return false
}

//删除操作 -> 删除指定位置的元素
func (node *Node) deleteByIndex(index int) bool {
	if node == nil || index < 0 {
		fmt.Println("node is nil or index < 0, please you notice....")
		return false
	}
	//计数器
	count := 0
	//临时指针
	p := node
	for ; p != nil; p = p.Next {
		//查找index位置的元素
		if count == index {
			p.Next = p.Next.Next
			return true
		}
		count++
	}
	if count < index {
		fmt.Println("index out of range.....")
	}
	return false
}

//查找操作 -> 查找指定的节点
func (node *Node) findElementByValue(value int) (int, bool) {
	//创建一个临时节点
	p := node
	count := 0
	for ; p != nil; p = p.Next {
		if value == p.Data {
			return count - 1, true
		}
		count++
	}
	return -1, false
}

func main() {
	fmt.Println(">>>> 单链表 SRART <<<<")
	//创建一个数组
	arr := [...]int{1, 3, 2, 7, 9}
	//传递切片过去, 因为数组是值传递, 切片是引用传递
	root := createLikedList(arr[:])
	root.printLikedList()
	//尾部插入元素
	root.tailInsert(Node{17, nil})
	root.printLikedList()
	//指定位置插入元素
	root.insertByIndex(10, Node{10, nil})
	root.printLikedList()
	//根据指定的位置删除元素
	root.deleteByIndex(0)
	//按照顺序遍历
	root.printLikedList()
	//查找特定元素
	fmt.Println(root.findElementByValue(2))
	fmt.Println(">>>> 单链表 END <<<<")
}

总结

1.Go语言的语法还是和其他语言不同的,比如函数返回值,参数的定义
2.Go语言可以使用vscode,idea goland去编写代码。
3.Go语言的命名规则和其他语言也不同,首字母大写表示public,小写表示private

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于AutoJs7实现的薅羊毛App专业版源码大分享

源码下载链接&#xff1a;https://pan.baidu.com/s/1QvalXeUBE3dADfpVwzF_xg?pwd0736 提取码&#xff1a;0736 专业版肯定比个人版功能强大并且要稳定。增加了很多功能的同时也测试封号的App&#xff0c;对于封号的App&#xff0c;给予剔除。虽然App数量减少了但是都是稳定的…

图书推荐|Python数据分析与挖掘实战(第2版)

Python数据分析与挖掘实战&#xff08;第2版&#xff09;一共分为三个部分&#xff0c;包括基础篇&#xff08;第1&#xff5e;5章&#xff09;、实战篇&#xff08;第6&#xff5e;12章&#xff09;、提高篇&#xff08;第13章&#xff09;。其中基础篇介绍了数据挖掘的基本原…

linux部署rabbitmq开启mqtt插件由于监听1883端口导致重启rabbitmq失败的解决方法

linux部署rabbitmq开启mqtt插件由于监听1883端口导致重启rabbitmq失败的解决方法 第一步&#xff1a;部署rabbitmq 部署rabbitmq请移步&#xff08;在这里可以找到erlang和rabbitmq适配的版本并下载安装包&#xff09;&#xff1a; https://blog.csdn.net/char1otte/article/de…

Flutter - 命令行工具源码调试环境搭建

文章目录 前言开发环境环境搭建运行测试调试测试最后 前言 开发Flutter项目时难免会遇到各种问题&#xff0c;源码调试对于问题的解决不可或缺。 对于Flutter框架项目的源码调试&#xff0c;如果是Flutter核心库调试&#xff0c;只需要创建一个Flutter项目并在项目中使用需要…

SpringCloud搭建Eureka服务注册中心(六)

前面说过eureka是c/s模式的 server服务端就是服务注册中心&#xff0c;其他的都是client客户端&#xff0c;服务端用来管理所有服务&#xff0c;客户端通过注册中心&#xff0c;来调用具体的服务&#xff1b; 我们先来搭建下服务端&#xff0c;也就是服务注册中心&#xff1b…

ansible-playbook

Ansible 的脚本 — playbook 剧本 playbooks 本身由以下各部分组成 &#xff08;1&#xff09;Tasks&#xff1a;任务&#xff0c;即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 &#xff08;2&#xff09;Variables&#xff1a;变量 &#xff08;3&a…

attention unet + cldice 论文总结

Blood Vessel Segmentation from Low-Contrast and Wide-Field Optical Microscopic Images of Cranial Window by Attention-Gate-Based Network论文总结 论文&#xff1a;Blood Vessel Segmentation by Attention-Gate-Based Network 目录 一、论文背景和出发点 二、创新点…

网络端口地址转换 NAPT 配置

你是某公司的网络管理员&#xff0c;公司办公网需要接入互联网&#xff0c;公司只向 ISP 申请了一条专线&#xff0c;该专线分配了一个公司 IP 地址&#xff0c;配置实现全公司的主机都能访问外网。 技术原理 NAT 将网络划分为内部网络和外部网络两部分&#xff0c;局域网主机…

基于spss的多元统计分析 之 实例3(血压、胆固醇于心脏病关系的研究)(8/8)

血压、胆固醇于心脏病关系的研究 摘要 一般线性模型中的一种&#xff0c;即反应变量 (dependent variables)为二分类变量的回归分析&#xff0c;模型输出为变量取特定值的概率。 在进行二元Logistic回归分析时&#xff0c;通常会涉及3个步骤&#xff0c;分别是数据处理、卡方分…

青翼科技自研模块化互联产品 • 模拟采集FMC子卡【产品资料】

FMC122是一款基于FMC标准规范&#xff0c;实现2路16-bit、1GSPS ADC同步采集&#xff0c;2路16-bit 2.5GSPS DAC同步回放功能子卡模块。该模块遵循VITA57.1标准&#xff0c;可直接与FPGA载卡配合使用&#xff0c;板卡ADC器件采用TI的ADS54J60芯片&#xff0c;该芯片具有两个模拟…

同一 tomcat 不同项目 session 共享实现

说明 这里仅讨论 同一个tomcat&#xff0c;部署了两个工程&#xff08;两个war包&#xff09;。不涉及不同tomcat,不涉及集群 背景 tomcat中的工程A包含用户登录、退出、权限控制等功能&#xff1b;工程B包含业务功能接口。工程A将用户登录信息加密响应给前端&#xff0c;前…

一个例子带你了解MapReduce

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

RT-DETR论文解读与代码

1.概述 目前以大名鼎鼎的YOLO为代表的基于CNN的实时监测网络需要NMS进行后处理&#xff0c;导致不能很好的优化网络&#xff0c;并且网络不够健壮&#xff0c;从而导致检测器的推理速度出现延迟。研究者也分析了Anchor-based和Anchor-free的YOLO的性能&#xff0c;发现Anchor并…

Java多线程与并发-原理

1、synchronized 线程安全问题的主要诱因 存在共享数据&#xff08;也称临界资源&#xff09;。存在多条线程共同操作这些共享数据。 解决问题的根本方法&#xff1a; 同一时刻有且只有一个线程在操作共享数据&#xff0c;其他线程必须等到该线程处理完数据后再对共享数据进…

Django之模板层

一、模板简介 在刚刚介绍完的视图层中我们提到&#xff0c;浏览器发送的请求信息会转发给视图进行处理&#xff0c;而视图在经过一系列处理后必须要有返回信息给浏览器。如果我们要返回html标签、css等数据给浏览器进行渲染&#xff0c;我们可以在视图中这么做 from django.s…

【Spring】核心与设计思想

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 谈起Java 圈子里的框架&#xff0c;最年长最耀眼的莫过于 Spring 框架啦&#xff0c;如今已成为最流行、最广泛使用的Java开发框架之一。不知道大家有没有在使用 Spring 框架的时候思考过这…

20230622作业:字符设备驱动内部实现原理及流程

1.1字符设备驱动内部实现原理 1>用户打开设备open("~/dev/mycdev",O_RDWR);("路径"&#xff0c;打开方式)2>在内核的虚拟文件系统层会同步执行sys_open函数,实现如下操作3>根据open函数的路径&#xff0c;找到struct inode结构体4>在struct…

基于ASP.NET MVC的网络书店系统/书店商城

摘 要 随着书店规模的不断扩大&#xff0c;人流数量的急剧增加&#xff0c;有关书店的各种信息量也在不断成倍增长。面对庞大的信息量&#xff0c;就需要有网络书店来提高书店工作的效率。通过这样的系统&#xff0c;我们可以做到信息的规范管理和快速查询&#xff0c;从而减少…

【深度学习】5-3 与学习相关的技巧 - Batch Normalization

如果为了使各层拥有适当的广度&#xff0c;“强制性”地调整激活值的分布会怎样呢&#xff1f;实际上&#xff0c;Batch Normalization 方法就是基于这个想法而产生的 为什么Batch Norm这么惹人注目呢?因为Batch Norm有以下优点&#xff1a; 可以使学习快速进行(可以增大学习…

Web安全——HTML基础

HTML 一、对于前端以及后端的认识以及分析二、HTML认知1、网页的组成2、浏览器3、Web标准 三、简单的HTML页面架构四、HTML常见标签1、meta标签2、标题标签3、文本属性4、form表单5、a 标签6、锚文本7、img 标签8、table 表格9、列表标签9.1、无序列表9.2、有序列表 10、框架的…