链表的实现(go语言)

news2024/10/2 5:45:46

摘要: 本文记录使用go语言对链表的实现。

链表的实现

节点结构

type Node struct {
	Data int
	Next *Node
}

新建节点

func NewNode(Data int) *Node {
	return &Node{
		Data: Data,
		Next: nil,
	}
}

尾部添加节点

在这里插入图片描述

// 尾部插入
func Append(head *Node, Data int) *Node {
	var cur = head
	for cur.Next != nil {
		cur = cur.Next
	}
	var newNode = NewNode(Data)
	newNode.Next = cur.Next
	cur.Next = newNode
	return head
}

头部添加节点

在这里插入图片描述

func PreAdd(head *Node, Data int) *Node {
	newNode := NewNode(Data)

	if head == nil {
		return newNode
	}

	newNode.Next = head
	return newNode

}

查看长度

func Length(head *Node) int {
	if IsEmpty(head) {
		return 0
	}
	var cur = head
	var length int
	for cur != nil {
		length++
		cur = cur.Next
	}
	return length

}

判断是否为空

func IsEmpty(head *Node) bool {
	if head == nil {
		return true
	}
	return false
}

判断是否包含指定值

func Contain(head *Node, Data int) bool {
	if IsEmpty(head) {
		return false
	}
	var cur = head
	for cur != nil {
		if cur.Data == Data {
			return true
		}
		cur = cur.Next
	}
	return false
}

删除节点

func Delete(head *Node, Data int) *Node {
	if head == nil {
		return head
	}

	// 判断是否包含值
	if !Contain(head, Data) {![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ba2d6c3a26bc47f18d82f484f93674a2.png)

		return head
	}

	// 如果头部节点就是要删除的节点
	if head.Data == Data {
		return head.Next
	}

	var pre = head
	var cur = head.Next

	for cur != nil {
		if cur.Data == Data {
			pre.Next = cur.Next
			return head
		}
		pre = cur
		cur = cur.Next
	}
	return head

}

完整代码

package main

import (
	"fmt"
)

/*

1. 新建节点
2. 尾部添加节点
3. 头部添加节点
4. 查看长度
5. 判断是否为空
6. 判断是否包含指定值
7. 删除节点


*/

type Node struct {
	Data int
	Next *Node
}

func NewNode(Data int) *Node {
	return &Node{
		Data: Data,
		Next: nil,
	}
}

func PreAdd(head *Node, Data int) *Node {
	newNode := NewNode(Data)

	if head == nil {
		return newNode
	}

	newNode.Next = head
	return newNode

}

// 尾部插入
func Append(head *Node, Data int) *Node {
	var cur = head
	for cur.Next != nil {
		cur = cur.Next
	}
	var newNode = NewNode(Data)
	newNode.Next = cur.Next
	cur.Next = newNode
	return head
}

// 遍历链表
func PrintList(head *Node) {
	if head == nil {
		return
	}

	cur := head
	for cur != nil {
		fmt.Printf("%v ", cur.Data)
		cur = cur.Next
	}
	fmt.Println()
}

func IsEmpty(head *Node) bool {
	if head == nil {
		return true
	}
	return false

}

func Length(head *Node) int {
	if IsEmpty(head) {
		return 0
	}
	var cur = head
	var length int
	for cur != nil {
		length++
		cur = cur.Next
	}
	return length

}

func Contain(head *Node, Data int) bool {
	if IsEmpty(head) {
		return false
	}
	var cur = head
	for cur != nil {
		if cur.Data == Data {
			return true
		}
		cur = cur.Next
	}
	return false
}

func Delete(head *Node, Data int) *Node {
	if head == nil {
		return head
	}

	// 判断是否包含值
	if !Contain(head, Data) {
		return head
	}

	// 如果头部节点就是要删除的节点
	if head.Data == Data {
		return head.Next
	}

	var pre = head
	var cur = head.Next

	for cur != nil {
		if cur.Data == Data {
			pre.Next = cur.Next
			return head
		}
		pre = cur
		cur = cur.Next
	}
	return head

}

func main() {
	head := NewNode(1)
	head = PreAdd(head, 2)
	head = PreAdd(head, 3)
	head = PreAdd(head, 4)
	head = PreAdd(head, 5)
	PrintList(head) // 5 4 3 2 1
	length := Length(head)
	fmt.Println("length=", length)
	fmt.Println(Contain(head, 4))

	head2 := NewNode(1)
	head2 = Append(head2, 2)
	head2 = Append(head2, 3)
	head2 = Append(head2, 4)
	head2 = Append(head2, 5)
	PrintList(head2)
	length = Length(head2)
	fmt.Println("length=", length)
	fmt.Println(Contain(head2, 1))
	fmt.Println(Contain(head2, 5))
	fmt.Println(Contain(head2, 10))

	head2 = Delete(head2, 5)
	PrintList(head2)

}

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

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

相关文章

信息安全工程师(28)机房安全分析与防护

前言 机房安全分析与防护是一个复杂而细致的过程,涉及到物理安全、环境控制、电力供应、数据安全、设备管理、人员管理以及紧急预案等多个方面。 一、机房安全分析 1. 物理安全威胁 非法入侵:未经授权的人员可能通过门窗、通风口等进入机房,…

【Java数据结构】 ArrayList 顺序表

一、什么是List 在集合框架中,List是一个接口,继承自Collection Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示: Iterable 也是一个接口,表示实现该接口的类是可以逐个元素…

Unity Asset Store的默认下载位置及更改下载路径的方法

修改Unity Asset Store的默认下载路径 Unity Asset Store默认下载位置 Unity Asset Store里下载资源,默认是下载到C盘里的,如果你不想做C盘战士的话,记得将下载的资源转移到其他盘。 Unity商城默认下载路径是C:\用户\用户名(一般…

电脑扬声器无法识别,没有声音处理

原因感觉就是前几天安装Realtek Audio Control驱动的时候,没有关闭360,导致的问题。 音量那里一直是 解决方法 开始菜单搜索“设备管理器” 在“声音、视频和游戏控制器”找到识别错的设备 右键“卸载设备” 右键扫描一下设备 此时一般就好了 …

数据结构-LRU缓存(C语言实现)

遇到困难,不必慌张,正是成长的时候,耐心一点! 目录 前言一、题目介绍二、实现过程2.1 实现原理2.2 实现思路2.2.1 双向链表2.2.2 散列表 2.3 代码实现2.3.1 结构定义2.3.2 双向链表操作实现2.3.3 实现散列表的操作2.3.4 内存释放代…

N32L40x基于串口的IAP升级升级速度2Mbps+上位机工具

1.软件升级流程 mcu开机上位机发送0xaa,0xaa,0x55,0x55,通知mcu进入升级状态,在收到该指令后,mcu擦除旧的APP程序,发送进入升级状态的指令,通知上位机进入升级状态擦除完成后进入升级状态,等待上位机发送升级包上位机开始发送数据包mcu接收数据包,并等待一个完成的数据包…

51单片机的智能家居【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温湿度传感器DS1302时钟模块光照传感器烟雾传感器蓝牙继电器按键、蜂鸣器、LED等模块构成。适用于智能家居监控烟雾、温湿度、光照和蓝牙控制等相似项目。 可实现基本功能: 1、LCD1602实时显示北京时间、室内温湿度…

【优选算法之哈希表】No.11--- 经典哈希表算法

文章目录 前言一、哈希表简介1.1 什么是哈希表1.2 哈希表的用途1.3 什么时候使用哈希表1.4 怎么用哈希表 二、哈希表示例2.1 两数之和2.2 判定是否互为字符重排2.3 存在重复元素2.4 存在重复元素 II2.5 字⺟异位词分组 前言 👧个人主页:小沈YO. &#x1…

重置linux后vscode无法再次使用ssh连接

如果你使用过vscode ssh远程连接了一个Linux系统,但该系统被重置了,并且关键配置没有改变。再次使用vscode连接时,vscode可能无法连接。 原因:vscode远程连接后会在C:\Users{{你的用户名}}.ssh下的known_hosts和known_hosts.old。…

C0008.Clion利用C++开发Qt界面,使用OpenCV时,配置OpenCV方法

安装OpenCV 配置环境 配置Clion中的CMakeLists.txt文件 # 设置OpenCV的安装路径 set(OpenCV_DIR "D:/OpenCv_Win/opencv/build/x64/vc16/lib")# 查找OpenCV包 find_package(OpenCV REQUIRED)下面添加的CMakeLists.txt文件中主要是添加了后面的${OpenCV_LIBS} # 链接…

Innodb磁盘结构

系统表空间 系统表空间的作用 存系统表中的数据存数据字典————保存系统变量和状态变量存变更缓冲区中未来得及落盘的数据 系统表空间文件位置 系统表可以对应磁盘上的多个表空间文件,默认情况下服务器在数据目录下创建一个名为ibdata1的文件 可以通过改变系…

解决方法:PDF文件打开之后不能打印?

打开PDF文件之后,发现文件不能打印?这是什么原因?首先我们需要先查看一下自己的打印机是否能够正常运行,如果打印机是正常的,我们再查看一下,文件中的打印功能按钮是否是灰色的状态。 如果PDF中的大多数功…

React 解释常见的 hooks: useState / useRef / useContext / useReducer

前言 如果对 re-render 概念还不清楚,建议先看 React & 理解 re-render 的作用、概念,并提供详细的例子解释 再回头看本文。 如果对 React 基础语法还不熟练,建议先看 React & JSX 日常用法与基本原则 再回头看本文。 useState useS…

虚幻引擎-设置UI自适应屏幕大小

在游戏中,如果想实现不同分辨率下,都可以支持当前的UI界面布局,都需要用到锚点功能。 ‌虚幻引擎中的UI锚点(Anchor)是指控件在屏幕或父物体上的固定点,用于确定控件的位置和布局。‌ 锚点的作用是确保UI元…

【LLM】手搓一个LLM Eval

文章目录 手搓一个LLM Eval项目的动机评测流程概述支持的数据集与评测指标详细的评测过程1. 生成式任务的F1评分1.1 模型推理1.2 结果评测 2. 思考 🚀 如何运行1. 运行模型推理2. 运行评测 支持的评测指标支持自定义评测学习总结 手搓一个LLM Eval TinyEval&#x…

B. Brightness Begins Codeforces Round 976 (Div. 2)

原题 B. Brightness Begins 解析 Hint 1 第 i 个灯泡最终状态与 n 的大小无关 Hint 2 第 i 个灯泡最终状态与 i 的约数数量的奇偶性相关 Solution 对任意灯泡 i , 它的最终状态由其约数数量的奇偶性相关, 如果 i 有偶数个约数, 那么会是亮的, 否则会是暗的. 换句话说, 如…

第四届高性能计算与通信工程国际学术会议(HPCCE 2024)

目录 大会简介 主办单位,承办单位 征稿主题 会议议程 参会方式 大会官网:www.hpcce.net 大会简介 第四届高性能计算与通信工程国际学术会议(HPCCE 2024)将于2024年11月22-24日在苏州召开。HPCCE 2024将围绕“高性能计算与通信工…

回归预测 | Matlab基于SABO-SVR减法平均算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于SABO-SVR减法平均算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SABO-SVR减法平均算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于SABO-SVR减法平均算法优化…

CSP-J Day 1 模拟赛补题报告

姓名:王胤皓,校区:和谐校区,考试时间:2024年10月1日9:00:00~12:30:00,学号:S07738 CSP-J Day 1 模拟赛补题报告 前言 考了我们班 Rank 1 1 1。 本人在发烧状态下进行写作,勿喷。…

MySQL 问题小结

mysqld --initialize 初始化 data 文件夹 初始化的密码在这个 err 文件夹中