Go语言实现数据结构(一)单链表
1. 基本释义
线性表包含两种存储方法:顺序存储结构和链式存储结构,其中顺序表的缺点是不便插入与删除数据;接下来我们重点实现基于Go语言的链式存储线性表。
2. 结构体设计
每个结点包含两部分:数据域+指针域,上一个结点的指针指向下一结点,首尾相连,形成链表。特别注意的是每个链表必须包含头结点(数据域为空);
//导入包
package main
import "fmt"
//创建 结点 结构体
type Node struct{
Data interface{}
Next *Node // Next = &Node
}
//链表 结构体
type LList struct{
Head *Node
Length int
}
3. 基本方法设计
在创建完链表后,我们将实现链表的基本操作和辅助操作,基本操作指的是(新增)插入数据、删除数据、查找数据、求链表长度;而辅助操作指的是创建结点、创建(初始化 )链表、判断是否为空链表,此处和其他语言不同之处是Go语言具有垃圾自动回收的特性,因此不需要释放指针或内存,后续没有用到的变量Go语言会自动回收。
a.设计接口
type Method interface {
Insert(i int,v interface{}) //增
Delete(i int) //删
GetLength() int //getLength
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.基于链表结构体 LList 实现接口 Method 中的基本方法
//在i处插入节点(前插)
func (list *LList)Insert(i int,v interface{}){
s := CreateNode(v) //*Node
pre := list.Head //*Node
for count:=0;count<=i-1;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{
pre := list.Head
for pre.Next!=nil{
list.Length++
}
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 //*Node
fmt.Println("LList shows as follow:...")
for i:=0;i<=list.Length;i++{
fmt.Printf( "%v\n",pre)
pre = pre.Next
}
}
4.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)
}
说明:以上Code可直接复现,关于插入法还有后插法,查找也可按索引位置查找,读者可自行复现。
Go语言实现数据结构(一)单链表的更多相关文章
- Python数据结构之单链表
Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...
- javascript数据结构之单链表
下面是用javascript实现的单链表,但是在输出的时候insert方法中存在问题,chrome的console报错说不能读取空的属性,调试了很久都没有通过,先在这里存着,以后再来修改一下. //数 ...
- 数据结构之单链表的实现-java
一.单链表基本概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元(一般是非连续存储单元)存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素data + 指针next ...
- 数据结构 - 动态单链表的实行(C语言)
动态单链表的实现 1 单链表存储结构代码描述 若链表没有头结点,则头指针是指向第一个结点的指针. 若链表有头结点,则头指针是指向头结点的指针. 空链表的示意图: 带有头结点的单链表: 不带头结点的单链 ...
- 数据结构 - 静态单链表的实行(C语言)
静态单链表的实现 1 静态链表定义 静态链表存储结构的定义如下: /* 线性表的静态链表存储结构 */ #define MAXSIZE 1000 /* 假设链表的最大长度是1000 */ typede ...
- 数据结构(一) 单链表的实现-JAVA
数据结构还是很重要的,就算不是那种很牛逼的,但起码得知道基础的东西,这一系列就算是复习一下以前学过的数据结构和填补自己在这一块的知识的空缺.加油.珍惜校园中自由学习的时光.按照链表.栈.队列.排序.数 ...
- python 数据结构之单链表的实现
链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就 ...
- 【数据结构】单链表&&静态链表详解和代码实例
喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 单链表(Singly Linked List ) 1.1 什么是单链表? 单链表是一种链式存储的结构.它动态的为节点分配存 ...
- Java数据结构之单链表
这篇文章主要讲解了通过java实现单链表的操作,一般我们开始学习链表的时候,都是使用C语言,C语言中我们可以通过结构体来定义节点,但是在Java中,我们没有结构体,我们使用的是通过类来定义我们所需要的 ...
- 【数据结构】单链表介绍及leetcode206题反转单链表python实现
题目传送门:https://leetcode-cn.com/problems/reverse-linked-list/ 文章目录 单链表介绍 链表 概念 种类 优缺点 单链表(slist) leetc ...
随机推荐
- 使用Swoole 构建API接口服务
网上类似的文章已经很多了,我也是刚入门.从头开始学习.所以如果重复写文章阐释,反而会浪费时间,于是就自己动手构建了一个demo,使用swoole 的TCP 服务器接受TCP客户端的发来的http请求, ...
- 安装和配置Apache服务器(下)
Apache的配置文档:http://httpd.apache.org/docs/current/. 1.监听端口: 默认的端口号为80端口,如果端口号冲突改为8080端口. 注:每改一次httpd. ...
- 如何为已有的类没有生成toString的方法增强生成toString方法
1:只要提到增强,我的第一思路就是代理,动态代理.但是仅仅是一个toString其实没必要使用代理模式了,有点大材小用了(动态代理其实也是最后通过反射生成toString的方法). 2:简单粗暴,可以 ...
- 理解传说中的roll、yaw、pitch
三维中 Yaw, pitch and roll 的区分(图片) yaw 航偏 pi ...
- Docker学习要点记录
Docker的架构和底层技术: 1.docker提供了一个开发,打包,运行app的平台2.把APP和底层infrastructure隔离开来 docker底层技术支持: 1>Namespaces ...
- 【转】系统去掉 Android 4.4.2 的StatusBar和NavigationBar
系统Hide Status Bar frameworks/base/core/res/res/values/dimens.xml 把 <dimen name="status_bar_ ...
- Python2.7-time
time模块,与datetime模块功能有所重合,time较为简单明了,若只需要当前时间或日期或是sleep,直接用time模块,需要更复杂的时间间隔等情况用datetime模块更好 1.获得time ...
- ASP.NET Core2.1 你不得不了解的GDPR(Cookie处理) - (转载)
前言 时间一晃 ASP.NET Core已经迭代到2.1版本了. 迫不及待的的下载了最新的版本,然后生成了一个模版项目来试试水. ...然后就碰到问题了... 我发现..cookie竟然存不进去了.. ...
- Swoole Task 的应用
目录 概述 代码 小结 扩展 参考文档 概述 Swoole 异步Task,主要实现调用异步任务的执行. 常用的场景:异步支付处理.异步订单处理.异步日志处理.异步发送邮件/短信等. Swoole 的实 ...
- golang channel 源码剖析
channel 在 golang 中是一个非常重要的特性,它为我们提供了一个并发模型.对比锁,通过 chan 在多个 goroutine 之间完成数据交互,可以让代码更简洁.更容易实现.更不容易出错. ...