Go语言实现单链表

news2024/12/24 2:23:24

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

文章目录

  • 前言
  • 一、个人见解,为什么学GO?
  • 二、Go语言实现单链表
    • 1.创建节点
    • 2.通过数组创建一个单链表
    • 3.遍历单链表
    • 4.单链表插入操作
      • 4.1 伪代码
      • 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

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

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

相关文章

HOOPS Visualize SDK 2023 Crack

桌面和移动工程应用程序的图形引擎 HOOPS Visualize 是 3D 图形 SDK&#xff0c;支持来自市场领导者 Hexagon、Trimble、Ansys、SOLIDWORKS、™ Autodesk 等的数百个工程应用程序。 用于 3D CAD 渲染的图形 SDK HOOPS Visualize 是一个以工程为中心的高性能图形库&#xff0c…

安卓蓝牙ATT协议介绍

介绍 ATT&#xff0c;Attribute Protocol&#xff0c;用于发现、读、写对端设备的协议(针对BLE设备) ATT允许蓝牙远程设备&#xff08;比如遥控器&#xff09;作为服务端提供拥有关联值的属性集&#xff0c;让作为客户端的设备&#xff08;比如手机、电视&#xff09;来发现、…

通用能力及AI核心能力表现优异!合合信息智能文档处理系统(IDP)高评级通过中国信通院评估

数字经济快速发展的背后&#xff0c;全球数据总量呈现出爆发式增长趋势。智能文档处理&#xff08;IDP&#xff09;技术能够高效地从多格式文档中捕捉、提取和处理数据&#xff0c;帮助机构和企业大幅提升文档处理效率&#xff0c;节约时间和人力成本。近期&#xff0c;合合信息…

C语言进阶--字符函数与内存函数

目录 一.字符函数 1.strlen函数 模拟实现strlen 2.strcpy函数 模拟实现strcpy 3.strcat函数 模拟实现strcat strcat能否用于自己追加自己&#xff1f; 4.strcmp函数 模拟实现strcmp 5.strncpy函数 6.strncat函数 7.strncmp函数 模拟实现strncmp 8.strstr函数 模…

哨兵2号数据下载与利用Python处理(波段融合、降采样、可视化、裁剪等)

简单介绍 网址:https://scihub.copernicus.eu/dhus/#/home 哨兵2号(Sentinel-2)是欧洲空间局(European Space Agency,简称ESA)推出的一组遥感卫星,旨在为地球观测和环境监测提供高质量的光学图像数据。 S2MSI2A是哨兵2号卫星的一种传感器。 S2MSI2A是哨兵2号卫星搭载…

huggingface - PEFT.参数效率微调

GitHub - huggingface/peft: &#x1f917; PEFT: State-of-the-art Parameter-Efficient Fine-Tuning. 最先进的参数高效微调 (PEFT) 方法 Parameter-Efficient Fine-Tuning (PEFT) 方法可以使预训练语言模型 (PLM) 高效适应各种下游应用程序&#xff0c;而无需微调模型的所有…

记录--Vue3 封装 ECharts 通用组件

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 按需导入的配置文件 配置文件这里就不再赘述&#xff0c;内容都是一样的&#xff0c;主打一个随用随取&#xff0c;按需导入。 import * as echarts from "echarts/core"; // 引入用到的图表…

ctfshow web入门 php特性 web93-97

1.web93 intval($num,0),0代表根据变量类型进行使用哪一种进制进行取整 可以使用8进制&#xff0c;正负数&#xff0c;小数点 payload: 010574 4476.0 4476.0 2.web94 过滤了0&#xff0c;不能使用8进制了&#xff0c;还可以使用小数点&#xff0c;正负数等 payload&#xff1…

【Java算法题】剑指offer_算法之02动态规划

对于动态规划问题&#xff0c;我将拆解为如下五步曲&#xff0c;这五步都搞清楚了&#xff0c;才能说把动态规划真的掌握了&#xff01; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 JZ42 连续子数组的…

CTFshow-pwn入门-栈溢出pwn35-pwn36

pwn35 首先还是先下载pwn文件拖进虚拟机加上可执行权限&#xff0c;使用checksec命令查看文件的信息。 chmod x pwn checksec pwn32位的我们直接拖进ida中反编译&#xff1a; // main int __cdecl main(int argc, const char **argv, const char **envp) {FILE *stream; // […

阿里云 OSS介绍

1、什么是阿里云 OSS&#xff1f; OSS 为 Object Storage Service&#xff0c;即对象存储服务。是阿里云提供的海量、安全、低成本、高可靠的云存储服务。 OSS 具有与平台无关的 RESTful API 接口&#xff0c;可以在任意应用、任意时间、任意地点 存储与访问 任何类型的数据。…

软考:软件工程:软件可行性分析,需求分析,ER实体图,数据流图,状态转换图,数据字典

软考&#xff1a;软件工程: 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &#xff08;1&#…

微信小程序——分页组件的创建与使用

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

使用Aspose.Words将word转PDF并且去水印。

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;Java、工具类、转换、word转pdf、Aspose.Words、后端☀️每日 一言&#xff1a;只要思想不滑坡&#xff0c;办法总比困难多。 前言 在我们日常开发中经常会有将word文档转为PDF的场景&#xff0…

深入理解循环队列----循环数组实现ArrayDeque

我们知道队列这种数据结构的物理实现方式主要还是两种&#xff0c;一种是链队列&#xff08;自定义节点类&#xff09;&#xff0c;另一种则是使用数组实现&#xff0c;两者各有优势。此处我们将要介绍的循环队列其实是队列的一种具体实现&#xff0c;由于一般的数组实现的队列…

IP地址分类

IP地址是TCP/IP协议中非常关键的要素之一&#xff0c;它用于标识网络中的设备和主机。根据使用版本的不同&#xff0c;IP地址分为IPv4和IPv6两种类型。 IPv4&#xff08;Internet Protocol version 4&#xff09;是IP地址的第四个版本&#xff0c;采用32位二进制数来表示IP地址…

JavaWeb之EL表达式和JSTL标签库

文章目录 EL表达式基本介绍EL表达式搜索域数据的顺序EL表达式输出Bean的普通属性&#xff0c;数组属性&#xff0c;List集合属性&#xff0c;Map集合属性EL表达式 - 运算关系运算逻辑运算算数运算empty运算三元运算. 点运算 和 [] 中括号运算符 EL表达式的11个隐含对象EL获取四…

Java中Thread 类的五种基本用法(简介)

目录 一.线程创建 Lambda创建一个线程 基础格式 举例 运行结果 二.线程中断 第一种:设置变量方法 举例 运行结果 第二种:interrupted&#xff08;&#xff09;方法 举例 运行结果 三.线程等待 举例 运行结果 四.线程休眠 举例 五.获取线程实例 举例 运行结果 …

如何用梯度下降法求解数学建模的拟合问题——以logistics增长问题为例

引言 众所周知的是&#xff0c;在大学课程中一般只会教授一种拟合方法(也即参数估计方法)——最小二乘法。这是一种直接求解的方法&#xff0c;非常的有效&#xff0c;不仅是损失最小解&#xff0c;而且是最大似然解。只不过&#xff0c;有一个缺点&#xff0c;它只能解决线性…

Jenkins配置仅合并代码后触发流水线

使用GitLabJenkins集成&#xff0c; 使用Jenkins的Generic WebHook插件&#xff1b;此插件可以作为各个工具间集成使用的通用方式&#xff0c;但是遇到些场景需要写些代码。关于 “合并代码后触发Pipeline”的配置方式&#xff0c; 其实思路简单&#xff0c;实现和让我描述起来…