(一)用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方法并不修改原先的字符串,而是返回修改后的字符串. 而此字符串对象时用单链表 ...
随机推荐
- [DuckDB] 多核算子并行的源码解析
DuckDB 是近年来颇受关注的OLAP数据库,号称是OLAP领域的SQLite,以精巧简单,性能优异而著称.笔者前段时间在调研Doris的Pipeline的算子并行方案,而DuckDB基于论文< ...
- Jest + React 单元测试最佳实践
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 前言 单元测试是一种用于测试"单元"的软件测试方 ...
- MongoDB Compass的安装及使用图文说明(非常详细)
1.下载 MongoDB Compass 预编译二进制包下载地址:https://www.mongodb.com/try/download/compass 2.安装 MongoDB Compass 的 ...
- 为Jekyll静态网站添加PlantUML插件
前言 突然想起来要好好整理一下自己的博客空间,已经荒废很多年,如果再不捡起来,等到自己知识老化的时候再去写东西就没人看了. 使用Github Pages + Jekyll把博客发布为静态网站,给人感觉 ...
- golang使用JWX进行认证和加密
golang使用JWX进行认证和加密 最近看了一个名为go-auth的库,它将JWT作为HTTP cookie对用户进行验证,但这个例子中缺少了对JWT的保护,由此进行了一些针对JWX的研究. 下面描 ...
- Python 01-Unittest的使用 unittest简单应用
class TestCase01(unittest.TestCase): def setUp(self): print("用例开始") def te ...
- 容忍和污点Taint和Toleration
说明: Taint在一类服务器上打上污点,让不能容忍这个污点的Pod不能部署在打了污点的服务器上. Toleration是让Pod容忍节点上配置的污点,可以让一些需要特殊配置的Pod能够调用到具有 污 ...
- BackTrader 简单BTC的SMA15回测DEMO
import time import requests import json import csv from requests.packages.urllib3 import disable_war ...
- Python实现图片重命名——实用
1 # encoding: utf-8 2 import os 3 import sys 4 5 import openpyxl 6 import tkinter as tk 7 from tkint ...
- python的assert和raise的用法
一.raise用法 在程序运行的过程当中,除了python自动触发的异常外,python也允许我们在程序中手动设置异常,使用 raise 语句即可, 为什么还要手动设置异常呢?首先要分清楚程序发生异常 ...