go语言实现单链表
线性表包含两种存储方法:顺序存储结构和链式存储结构,其中顺序表的缺点是不便插入与删除数据。
单链表:每个结点包含两部分:数据域+指针域,上一个结点的指针指向下一结点,依次相连,形成链表。特别注意的是每个链表必须包含头结点(数据域一般无意义或者为空,有时用来存储链表长度等等)

下面的代码实现链表的基本操作和辅助操作,基本操作指的是插入数据、删除数据、查找数据、求链表长度;而辅助操作指的是创建结点、创建(初始化 )链表、判断是否为空链表。和其他语言不同之处是Go语言具有垃圾自动回收的特性,因此不需要释放指针或内存,后续没有用到的变量Go语言会自动回收。
// 单链表:
package main import "fmt" // 创建节点结构/类型
type Node struct {
Data interface{}
Next *Node
} // 创建链表结构
type LList struct {
Head *Node
Length int // 这里的链表长度不计入头节点
} // a.设计接口:
type Method interface {
Insert(i int, v interface{}) // 增
Delete(i int) // 删
GetLength() int // 获取长度
Search(v interface{}) int // 查
isNull() bool // 判断是否为空
} // b.初始化函数:
// 创建节点
func CreateNode(v interface{}) *Node {
return &Node{v, nil}
}
// 创建空链表
func CreateList() *LList {
return &LList{CreateNode(nil), 0}
} // c.基于链表结构体实现接口 Method 中的方法:
// 在 i 处插入节点(前插??——即插入到原来的第 i 个节点之前,成为现在的第 i 个节点)
func (list *LList) Insert(i int, v interface{}) {
s := CreateNode(v)
pre := list.Head
for count:=0; count<=i; count++ {
if count == i-1 {
s.Next = pre.Next
pre.Next = s
list.Length++
}
pre = pre.Next
}
}
// 删除第 i 处节点
func (list *LList) Delete(i int) {
pre := list.Head
for count:=0; count<=i-1; count++ {
s := pre.Next
if count == i-1 {
pre.Next = s.Next
list.Length--
}
pre = pre.Next
}
}
// 返回链表长度
func (list *LList) GetLength() int {
return list.Length
}
// 查询值 v 所在的位置
func (list *LList)Search(v interface{}) int {
pre := list.Head.Next
for i:=1; i<=list.Length; i++ {
if pre.Data == v {
return i
}
pre = pre.Next
}
return 0
}
// 判空
func (list *LList) isNull() bool {
pre := list.Head.Next
if pre == nil {
return true
}
return false
} // d.设计链表打印输出函数:
func PrintList(list *LList) {
pre := list.Head.Next
fmt.Println("LList shows as follows: ...")
for i:=1; i<=list.Length;i++ {
fmt.Printf("%v\n", pre.Data)
pre = pre.Next
}
} // main 函数:
func main() {
lList := CreateList()
fmt.Println("List is null: ", lList.isNull())
var M Method
M = lList // 接口类型的变量可以存储所有实现该接口的类型变量
M.Insert(1, 3)
M.Insert(2, 6)
M.Insert(1, 5) PrintList(lList)
fmt.Println("List length is: ", lList.Length)
fmt.Println("元素6在位置:", M.Search(6))
fmt.Println("元素100在位置:", M.Search(100))
fmt.Println("List is null: ", lList.isNull()) M.Delete(2)
PrintList(lList)
fmt.Println("List length is: ", lList.Length)
} 打印结果:
go语言实现单链表的更多相关文章
- C语言实现单链表-03版
在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4, ...
- C语言实现单链表-02版
我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1 ...
- C语言实现单链表,并完成链表常用API函数
C语言实现单链表,并完成链表常用API函数: 1.链表增.删.改.查. 2.打印链表.反转打印.打印环形链表. 3.链表排序.链表冒泡排序.链表快速排序. 4.求链表节点个数(普通方法.递归方法). ...
- C语言实现单链表节点的删除(带头结点)
我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...
- C/C++语言实现单链表(带头结点)
彻底理解链表中为何使用二级指针或者一级指针的引用 数据结构之链表-链表实现及常用操作(C++篇) C语言实现单链表,主要功能为空链表创建,链表初始化(头插法),链表元素读取,按位置插入,(有序链表)按 ...
- 「C语言」单链表/双向链表的建立/遍历/插入/删除
最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...
- 一起talk C栗子吧(第十二回:C语言实例--单链表一)
各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子.也就是C语言实例.闲话休提, 言归正转. 让我们一起talk C栗子吧! 看官们,上一回中咱们没有说详细的样例,并且是说了样例中的文 ...
- C语言实现单链表(不带头结点)节点的插入
对单链表进行增删改查是最主要的操作.我在上一篇博客<C语言实现链表节点的删除>实现了删除单链表中的某个节点. 这里我们要来实如今某个位置插入节点.演示样例代码上传至https://gith ...
- C语言实现单链表(带头节点)
C语言在实现单链表存储时需要注意的几点: 1.定义结构体,typedef:用于给结构体另命名 // 定义结构体类型 typedef struct Node{ int data; struct Node ...
- C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作
1.数据结构-单链表的实现-C语言 typedef struct LNode { int data; struct LNode* next; } LNode,*LinkList; //这两者等价.Li ...
随机推荐
- 修改docker默认存储路径
默认情况下,docker镜像的默认存储路径是/var/lib/docker,这相当于直接挂载系统目录下,而一般在搭系统时,这个区都不会太大,所以如果长期使用docker开发应用,就需要把默认的路径更改 ...
- win10常用快捷键(热键)总结
win10常用快捷键总结: win+Ctrl+D 创建虚拟桌面 win+Ctrl+左(右)键 切换虚拟桌面 win+Ctrl+F4 关闭虚拟桌面 win+D 隐藏所有窗口/显示所有窗口 win+M 隐 ...
- NoSql数据库Redis系列(3)——Redis数据持久化(RDB)
大家都知道 Redis 是一个内存数据库,所谓内存数据库,就是将数据库中的内容保存在内存中,这与传统的MySQL,Oracle等关系型数据库直接将内容保存到硬盘中相比,内存数据库的读写效率比传统数据库 ...
- Mybatis传参- 被逗号分割的字符串
String ids = "1,2,3,4,5,6",如ids作为参数传递,查询list返回.mybatis用foreach处理并返回. SELECT * FROM yp_popu ...
- Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [spring-mybatis.xml]: Initialization of bean failed
- sanity checking
https://zh.wikipedia.org/wiki/健全性测试 Modules\_threadmodule.c /* Lock objects */ typedef struct { PyOb ...
- 【E2E】Tesseract5+VS2017+win10源码编译攻略
一,记录我目前在win10 X64和VS2017的环境下成功编译Tesseract5.0的方式: 二,记录在VS2017 C++工程中调用Tesseract4.0的方法: 三,记录编译和调用Tesse ...
- 【转载】 机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能
原文地址: https://www.cnblogs.com/steven-yang/p/5686473.html ------------------------------------------- ...
- 网站无法连接上,但能上QQ的解决办法
一句话:修改DNS的IP地址 参考win10修改IP地址:https://jingyan.baidu.com/article/19192ad8eef0c9e53e570717.html 在网络上搜索合 ...
- 报错 react-hot-loader
./node_modules/element-react/dist/npm/es5/libs/animate/index.js Module not found: Can't resolve 'rea ...