(一)用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方法并不修改原先的字符串,而是返回修改后的字符串. 而此字符串对象时用单链表 ...
随机推荐
- JAVA8 常见用法
1 . 集合List<T> 去单个元素,返回集合 List<Tbhr01> tbhr01List = new ArrayList<Tbhr01>(); List&l ...
- Powershell获取当前文件夹内所有一级子文件夹大小
需求:查看Windows某个文件夹所有一级子文件夹大小,并按照从大到小排序 解决方案:使用Powershell脚本 脚本内容如下 function filesize () { [string]$f ...
- JZOJ 4417. 【HNOI2016模拟4.1】神奇的字符串
不能算解析的解析 很神仙的题 知道做法后很容易实现 这里不写题解 推荐一个:4417. [HNOI2016模拟4.1]神奇的字符串 感谢写此博文的神犇! \(Code\) #include<cs ...
- Linux 下安装Nginx两种方法- yum安装 and Centos7下yum安装配置nginx与php
转载csdn: Linux 下安装Nginx两种方法- yum安装_在电脑前深思的博客-CSDN博客 Linux安装Nginx(两种方式)_HHRunning的博客-CSDN博客_linux 是否安装 ...
- 英国学者在真实世界早期RA队列研究中发现较高比例的临床缓解患者仍存在能量多普勒超声活性
标签: 类风湿关节炎; 目标治疗策略; 能量多普勒活性; 预测因子 英国学者在真实世界早期RA队列研究中发现较高比例的临床缓解患者仍存在能量多普勒超声活性 电邮发布日期:2016年4月6日 本研究的重 ...
- Yapi安装配置(CentOs)
环境要求 nodejs(7.6+) mongodb(2.6+) git 准备工作 清除yum命令缓存 sudo yum clean all 卸载低版本nodejs yum remove nodejs ...
- python中time模块的常用方法的转换关系图
获取当前的时间戳 把时间戳转换成了时间的格式 获取时间 把时间格式数据转换为易识别的字符串 获取到表示时间的字符串,再转换为时间数据.
- jquery获得标签的值或元素的内容
例如: .html() 获取a标签中的i元素 console.error($("a[name=" + index + "]").html()); 设置a标签里的 ...
- C# 元组类型和元组文本
从 C# 7.0 开始,可以使用元组类型和元组文本轻松实现此目的. 元组类型定义元 组元素的数据类型. 元组文本提供返回的元组的实际值. 在下面的示例中, (string, string, strin ...
- DevExpress gridControl 字体居住
设置列的标题居中显示: Designer - Views -右侧输入框中输入Appearance-HeaderPanel-TextOptions-设置HAlignment为Center 设置单元格内容 ...