(一)用go实现单链表
本篇,我们用go简单的实现单链表这种数据结构。
1.节点定义
type Node struct{
data int
next *Node
}
2.节点的添加
// 尾插法插入节点
func (p *Node) Append(data int) {
for p.next != nil {
p = p.next
}
var newNode *Node = new(Node)
newNode.data = data
p.next = newNode
fmt.Printf("插入数据:%d\n", data)
}
3.节点的删除
// 删除尾节点并返回其值
func (p *Node) Pop() (int, error) {
if p.next == nil {
return 0, errors.New("Error: pop from empty list!")
}
var tmp *Node
for p.next != nil {
tmp = p
p = p.next
}
tmp.next = nil
fmt.Printf("删除数据:%d\n", p.data)
return p.data, nil
}
4.节点的查询
// 查询第i个节点的值
func (p *Node) Find(i int) (int, error) {
for p.next != nil && i > 0 {
p = p.next
i -= 1
}
if i > 0 {
return 0, errors.New("Error: the node not exist!")
}
return p.data, nil
}
5.节点的修改
// 修改第i个节点的值
func (p *Node) Update(i, data int) (error) {
for p.next != nil && i > 0 {
p = p.next
i -= 1
}
if i > 0 {
return errors.New("Error: the node not exist!")
}
p.data = data
return nil
}
6.节点的遍历
// 遍历输出
func (p *Node) Traverse() {
fmt.Printf("遍历结果:")
for p.next != nil {
fmt.Printf("%d ", p.next.data)
p = p.next
}
fmt.Printf("\n")
}
7.测试代码
func main() {
var head *Node
head = new(Node)
for a := 0; a < 10; a++ {
head.Append(a)
}
head.Traverse()
data, err := head.Pop()
if err != nil {
fmt.Println(err)
}
fmt.Printf("Pop返回数据:%d\n", data)
head.Traverse()
data, err = head.Find(3)
if err != nil {
fmt.Println(err)
}
fmt.Printf("查询的数据为:%d\n", data)
err = head.Update(2, 20)
if err != nil {
fmt.Println(err)
}
head.Traverse()
}
// 测试结果
插入数据:0
插入数据:1
插入数据:2
插入数据:3
插入数据:4
插入数据:5
插入数据:6
插入数据:7
插入数据:8
插入数据:9
遍历结果:0 1 2 3 4 5 6 7 8 9
删除数据:9
Pop返回数据:9
遍历结果:0 1 2 3 4 5 6 7 8
查询的数据为:2
遍历结果:0 20 2 3 4 5 6 7 8
8.完整代码
package main
import (
"fmt"
"errors"
)
type Node struct{
data int
next *Node
}
// 遍历输出
func (p *Node) Traverse() {
fmt.Printf("遍历结果:")
for p.next != nil {
fmt.Printf("%d ", p.next.data)
p = p.next
}
fmt.Printf("\n")
}
// 尾插法插入节点
func (p *Node) Append(data int) {
for p.next != nil {
p = p.next
}
var newNode *Node = new(Node)
newNode.data = data
p.next = newNode
fmt.Printf("插入数据:%d\n", data)
}
// 删除尾节点并返回其值
func (p *Node) Pop() (int, error) {
if p.next == nil {
return 0, errors.New("Error: pop from empty list!")
}
var tmp *Node
for p.next != nil {
tmp = p
p = p.next
}
tmp.next = nil
fmt.Printf("删除数据:%d\n", p.data)
return p.data, nil
}
// 查询第i个节点的值
func (p *Node) Find(i int) (int, error) {
for p.next != nil && i > 0 {
p = p.next
i -= 1
}
if i > 0 {
return 0, errors.New("Error: the node not exist!")
}
return p.data, nil
}
// 修改第i个节点的值
func (p *Node) Update(i, data int) (error) {
for p.next != nil && i > 0 {
p = p.next
i -= 1
}
if i > 0 {
return errors.New("Error: the node not exist!")
}
p.data = data
return nil
}
func main() {
var head *Node
head = new(Node)
for a := 0; a < 10; a++ {
head.Append(a)
}
head.Traverse()
data, err := head.Pop()
if err != nil {
fmt.Println(err)
}
fmt.Printf("Pop返回数据:%d\n", data)
head.Traverse()
data, err = head.Find(3)
if err != nil {
fmt.Println(err)
}
fmt.Printf("查询的数据为:%d\n", data)
err = head.Update(2, 20)
if err != nil {
fmt.Println(err)
}
head.Traverse()
}
(一)用go实现单链表的更多相关文章
- 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法
有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...
- 单链表的C++实现(采用模板类)
采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作. 链表结构定义 定义单链表 ...
- Java实现单链表的各种操作
Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素 4.实现链表的反转 5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...
- [LeetCode] Linked List Cycle II 单链表中的环之二
Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...
- c++单链表基本功能
head_LinkNode.h /*单链表类的头文件*/#include<assert.h>#include"compare.h"typedef int status; ...
- 单链表、循环链表的JS实现
数据结构系列前言: 数据结构作为程序员的基本知识,需要我们每个人牢牢掌握.近期我也展开了对数据结构的二次学习,来弥补当年挖的坑...... 当时上课的时候也就是跟着听课,没有亲自实现任何一种数据结 ...
- C代码实现非循环单链表
C代码实现非循环单链表, 直接上代码. # include <stdio.h> # include <stdlib.h> # include <malloc.h> ...
- 分离的思想结合单链表实现级联组件:CascadeView
本文介绍自己最近做省市级联的类似的级联功能的实现思路,为了尽可能地做到职责分离跟表现与行为分离,这个功能拆分成了2个组件并用到了单链表来实现关键的级联逻辑,下一段有演示效果的gif图.虽然这是个很常见 ...
- 数据结构:单链表结构字符串(python版)添加了三个新功能
#!/urs/bin/env python # -*- coding:utf-8 -*- #异常类 class stringTypeError(TypeError): pass #节点类 class ...
- 数据结构:单链表结构字符串(python版)改进
此篇文章的replace实现了字符串类的多次匹配,但依然有些不足. 因为python字符串对象为不变对象,所以replace方法并不修改原先的字符串,而是返回修改后的字符串. 而此字符串对象时用单链表 ...
随机推荐
- 亲测有效! TG Pro 实时温度工具 V2.7.6 for mac 破解版
亲测有效! TG Pro 实时温度工具 V2.7.6 for mac 破解版 TG Pro (Temperature Gauge Pro) 是一款专业显示你的Mac实时温度的软件,可以在系统内的菜单栏 ...
- JS 计算两个时间戳相差年月日时分秒
// JS 计算两个时间戳相差年月日时分秒 calculateDiffTime(startTime, endTime, type) { var runTime = parseInt(endTime - ...
- typora永久插入图片
https://c.runoob.com/front-end/59 首先将图片通过在线转码工具转换成base64的编码,并用以下格式嵌入即可,格式如下: ![image] (base64) 但是由于这 ...
- Zstack救急实战记录
起了这么个标题很容易引起歧义,先说明:是Zstack云架构帮我救急,而不是Zstack系统出了问题被救.具体容我慢慢道来: 使用Docker搭建EPICS的IOC记录 去年暑假时在一台工控机上裸装ce ...
- Zstack迁移实战记录1
https://blog.csdn.net/weixin_43767046/article/details/113748775 这段时间除了那个重度烤机测试(上面链接),还在做另一件事,想再做一个服务 ...
- xmind使用分享
Xmind 介绍 1. 特点 是表达发散性思维的有效工具,图文并重,把各主题的隶属关系和相关的层级表现出来,把关键字与图像,文字,颜色建立起链接记忆. 2.安装,下载与破解 参考:https://bl ...
- JZOJ 2022.02.10【提高组】模拟总结
\(\text{简要题解}\) \(\text{GDOI2012}\) 的题 不得不说当年的题做起来真的很不爽 整体看起来就是数据结构+博弈论+宽搜+背包dp优化 考场上 \(T1\) 十分钟解决过了 ...
- Gear_Of_War#1
Gear_Of_War#1 目录 Gear_Of_War#1 1 信息收集 1.1 端口扫描 1.2 后台目录扫描 1.3 SMB服务安全分析 2 GetShell 2.1 ssh登录marcus用户 ...
- Word 设置脚注和尾注
描述 脚注一般位于页面的底部,作为文档某处内容的注释.尾注一般位于文档的末尾,列出引文的出处等. 设置脚注和尾注 将光标移动到要插入脚注或尾注的地方,然后点击"引用"选项卡. 左边 ...
- 三天吃透Java并发八股文!
本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...