(一)用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方法并不修改原先的字符串,而是返回修改后的字符串. 而此字符串对象时用单链表 ...
随机推荐
- Vue09 事件
1 事件语法 Vue 中的事件绑定可以使用 v-on 指令进行处理,可以把 v-on 绑定事件简写为 @. <div id="root"> <button @cl ...
- JAVA虚拟机11-Class文件结构
1.平台无关性和语言无关性 Oracle公司以及其他虚拟机发行商发布过许多可以运行在各种不同硬件平台和操作系统上的Java虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码,从而实现了程序的&q ...
- Typescript 回调函数、事件侦听的类型定义与注释--拾人牙慧
实际项目中会运到的 Typescript 回调函数.事件侦听的类型定义,如果刚碰到会一脸蒙真的,我就是 这是第一次我自己对 Typescript 记录学习,所以得先说一下我与 Typescript 的 ...
- JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫
题目大意 对于 \(m = [1,\lfloor \frac n 2 \rfloor]\) 要求在一个序列中恰好选出 \(m\) 个不相邻的数使得权值和最大 其中 \(1\) 的左边是 \(n\),\ ...
- C#本地时间转Unix时间
获取Unix时间最高效的方法 /// <summary> /// 扩展方法, 本地时间转Unix时间; (如 本地时间 "2020-01-01 20:20:10" 转换 ...
- 排查问题-输出pojo日志,尽量用json
背景: 下午在做一个前后端md5加密签名校验. 前端用参数A,B,C,经过MD5加密函数,得到签名D. 然后前端带着ABCD一块来到后端. 同样的,后端拿到请求后,用MD5函数对ABC进行加密,得到签 ...
- GoLang中signal.Notify函数用法
官方描述: Notify函数让signal包将输入信号转发到c.如果没有列出要传递的信号,会将所有输入信号传递到c:否则只传递列出的输入信号. signal包不会为了向c发送信息而阻塞(就是说如果发送 ...
- vue项目中禁用浏览器缓存配置案例
项目发布新版本,部署线上后用户浏览器需要清理缓存 1.public文件夹中修改 index.html文件meta配置 <meta http-equiv="Cache-Control&q ...
- openssl用法详解 【转】
原文: http://www.178linux.com/48764 OpenSSL 是一个开源项目,其组成主要包括一下三个组件: openssl:多用途的命令行工具 libcrypto:加密算法库 l ...
- 设计模式 > 单一职责原则
SOLID原则并非单纯的1个原则,而是由5个设计原则组成的,它们分别是单一职责原则,开闭原则,里氏替换原则,接口隔离原则和依赖反转原则. 单一职责原则(SRP) 定义:一个类或者模块只负责完成一个职责 ...