(一)用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方法并不修改原先的字符串,而是返回修改后的字符串. 而此字符串对象时用单链表 ...
随机推荐
- Nginx06 Rewrite
1 简介 rewrite模块即ngx_http_rewrite_module模块,主要功能是改写请求URI,是Nginx默认安装的模块.rewrite模块会根据PCRE正则匹配重写URI,然后发起内部 ...
- 5步带你入门GaussDB(DWS)的GDS导入导出
摘要:本篇文档为使用GDS导入示例的具体简单步骤和示例. 本文分享自华为云社区<带你快速入门GDS导入导出,玩转PB级数仓GaussDB(DWS)>,作者: yd_220527686. 1 ...
- ubuntu16.04安装ROS+cartographer
使用张明明大神修改编译版 注意:中间出过很多错误,大部分是开源包eigen,protobuf的版本与该SLAM不匹配. 之前装了eigen的,删掉.protobuf我装的是3.6.1 1.安装依赖性: ...
- C语言排序 冒泡 选择 快排
冒泡排序 冒泡排序是一种简单的排序算法,其基本思想是重复地交换相邻两个元素,将较大的元素向右"冒泡",较小的元素向左"沉淀",从而将序列中的最大元素逐渐移到最后 ...
- Powershell获取当前文件夹内所有一级子文件夹大小
需求:查看Windows某个文件夹所有一级子文件夹大小,并按照从大到小排序 解决方案:使用Powershell脚本 脚本内容如下 function filesize () { [string]$f ...
- dvwa靶场搭建
安装 root@kali:~# apt -y install apache2 mariadb-common mariadb-server php php-mysql php-gd root@kali: ...
- 集合类再探:不可变类的好处,Collector接口详解,使用内部迭代
集合类再探 注:本文使用的pom依赖见文末. 集合类的基础 - Iterable.Iterator java语言层面支持对实现了Iterable接口的对象使用for-each语句.Iterator可以 ...
- label勾选问题,checkbox
<input id="overck_21" data-role="none" name="check" class="reg ...
- LeetCode算法训练-动态规划
欢迎关注个人公众号:爱喝可可牛奶 LeetCode算法训练-动态规划 理论知识 动态规划当前状态是由前一个状态推导出来的,而贪心没有状态的转移 动态规划需要借助dp数组,可能是一维也可能是二维的 首先 ...
- angular 基本操作
1.新建项目(带路由) ng new demo --routing 2.新建组件 统一放到components目录下(文件夹会自动创建) ng g component components/home ...