当前位置: 首页 > article >正文

链表的实现(go语言)

摘要: 本文记录使用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.kler.cn/news/328725.html

相关文章:

  • 【AIGC】ChatGPT提示词解析:如何打造个人IP、CSDN爆款技术文案与高效教案设计
  • DVWA | File Inclusion(文件包含)渗透测试
  • 十三、减少磁盘延迟时间的方法
  • SpringBoot上传图片实现本地存储以及实现直接上传阿里云OSS
  • Linux 文件 IO 管理(第三讲:文件系统)
  • vue从入门到精通
  • 成都睿明智科技有限公司抖音电商服务靠谱吗?
  • 前端如何实现图片伪防盗链,保护页面图片
  • 甄选范文“论网络安全体系设计”,软考高级论文,系统架构设计师论文
  • web开发(1)-基础
  • 什么是信息增益
  • MacOS配置python环境
  • 编程参考 - 动态链接库中的变量实例化
  • AccessoriesqueryController
  • 【韩顺平Java笔记】第5章:程序控制结构
  • 【异常数据检测】孤立森林算法异常数据检测算法(数据可视化 Matlab语言)
  • GPT对话代码库——esp32和单片机实现远程wifi升级代码方案。
  • windows系统中后台运行java程序
  • OIDC6-OIDC 授权流程类型
  • 秘密武器揭秘
  • 全国职业院校技能大赛(大数据赛项)-平台搭建Zookeeper笔记
  • 创新型城市试点名单最新数据(2006-2023年)
  • 【Nacos架构 原理】内核设计之Nacos通信通道
  • 生信初学者教程(二十一):LASSO+LR筛选候选标记物
  • 常用JS代码片段分享(总结)
  • 论文笔记——Graph Bottlenecked Social Recommendation
  • 【文件增量备份系统】MySQL百万量级数据量分页查询性能优化
  • vue3 父子组件调用
  • 【学习笔记】手写 Tomcat 八
  • python获取当月最后工作日实现在数据库查询指定日期数据(python+sql)