Go-单链表-栈和队列
package main import (
"errors"
"fmt"
"log"
) // 单链表
// 特征:
// 1. 每个节点都包含指向下一个节点的指针 next
// 2. 链表逻辑上是序列,但在内存中存储是不规则的
// 实现:
// 1. 头节点(根节点) head 单链表的起始位置,头节点不存放任何数据
// 2. 链表用来实现队列、栈、有序序列(插入排序)
// 3. 链表方法:
// a. 添加一个节点 Add
// b. 移除一个节点
// c. 遍历节点 // ValNode 值节点,存放所需数据,至于数据是什么,已经不重要,重要的是有一个指向下一个值节点的指针 next
type ValNode struct {
// data 存放数据
data interface{}
// 指向下一个节点的值节点指针,如果没有则为空地址 nil
next *ValNode
} // SingleLink 单链表,包含一个指向链表头部的指针 head
type SingleLink struct {
// 头指针 head 指向链表的头部
head *ValNode
} func NewSingleLink() *SingleLink {
return &SingleLink{
head: &ValNode{},
}
} // AddNode 在尾部添加一个节点: 找打尾部节点,将尾部节点的next指向新增加的节点
func (sl *SingleLink) AppendNode(v *ValNode) {
// 1. 找到尾部
tmp := sl.head
for tmp.next != nil {
tmp = tmp.next
}
// 2. 在尾部添加一个节点
tmp.next = v
} // 在尾部删除一个节点: 判断链表是否为空,判断链表是否只有一个元素,找到链表最后的上一个元素将next置为nil
func (sl *SingleLink) PopNode() (v *ValNode, err error) {
// 1. 判断是否是空链表, 空链表则返回空链表错误
if sl.head.next == nil {
err = errors.New("链表为空")
return
} // 2. 判断链表是否只有一个元素,如果为一个元素则将 head头节点的next置为 nil
if sl.head.next.next == nil {
v = sl.head.next
sl.head.next = nil
}
// 3. 找到链表的上一个元素将next置为nil
tmp := sl.head
for tmp.next.next != nil {
tmp = tmp.next
}
v = tmp.next
tmp.next = nil
return
} // 在头部删除一个节点: 判断链表是否为空,判断链表是否只有一个元素,将链表头指向链表头指向的下一个元素
func (sl *SingleLink) PopLeftNode() (v *ValNode, err error) {
// 1. 判断是否是空链表, 空链表则返回空链表错误
if sl.head.next == nil {
err = errors.New("链表为空")
return
} // 2. 判断链表是否只有一个元素,如果为一个元素则将 head头节点的next置为 nil
if sl.head.next.next == nil {
v = sl.head.next
sl.head.next = nil
}
// 3. 获取链表头指向的下一个元素,并将链表头指向的下一个元素的下一个元素
v = sl.head.next
sl.head.next = sl.head.next.next
return
} // ListLink 遍历列表,判断链表是否为空
func (sl *SingleLink) ListLink() {
// 1. 判断是否是空链表
if sl.head.next == nil {
fmt.Println("SingleLink empty")
return
}
// 2. 遍历链表
tmp := sl.head.next
for tmp != nil {
fmt.Println(tmp.data)
tmp = tmp.next
}
} // 通过链表的 AppendNode 和 PopNode实现了栈
// 通过链表的 AppendNode 和 PopLeftNode实现了队列 func main() {
sl := NewSingleLink()
node1 := &ValNode{
data: 100,
}
node2 := &ValNode{
data: 200,
}
sl.AppendNode(node1)
sl.AppendNode(node2)
node3, err := sl.PopNode()
if err != nil {
log.Println(err)
}
fmt.Println(node3)
sl.ListLink()
}
Go-单链表-栈和队列的更多相关文章
- Python实现栈、队列
目录 1. 栈的Python实现 1.1 以列表的形式简单实现栈 1.2 以单链表形式实现栈 2. 队列的Python实现 2.1 以列表实现简单队列 2.2 以单链表形式实现队列 本文将使用py ...
- Linux内核链表复用实现队列
有了前面Linux内核复用实现栈的基础,使用相同的思想实现队列,也是非常简单的.普通单链表复用实现队列,总会在出队或入队的时候有一个O(n)复杂度的操作,大多数采用增加两个变量,一个head,一个ta ...
- 线性表:实现单链表和子类栈(Stack)及单向队列(Queue) [C++]
刚刚开始学习c++.之前c的内容掌握的也不多,基本只是一本概论课的程度,以前使用c的struct写过的链表.用python写过简单的数据结构,就试着把两者用c++写出来,也是对c++的class,以及 ...
- java实现单链表、栈、队列三种数据结构
一.单链表 1.在我们数据结构中,单链表非常重要.它里面的数据元素是以结点为单位,每个结点是由数据元素的数据和下一个结点的地址组成,在java集合框架里面 LinkedList.HashMap(数组加 ...
- 栈和队列----将单链表的每K个节点之间逆序
将单链表的每K个节点之间逆序 给定一个单链表的头节点head,实现一个调整链表的函数,使得每K 个节点之间逆序,如果最后剩下不够K 个节点,则不调整最后几个. 例如: 链表:1—>2—>3 ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
- 数据结构(c语言第2版)-----了解链表,栈,队列,串
关于链表我觉得这都是最基本的东西,但是不常见,在实际的应用中很少的使用,了解它会用就OK,不需要研究的那么深,除非做那种内存压缩,存储方面工作. C语言中动态申请空间 malloc() q=(dlin ...
- &10 基本数据结构——栈,队列和链表
#1,栈(stack) 定义[来自百度]:栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素 ...
- 线性表 及Java实现 顺序表、链表、栈、队列
数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...
- 数组、链表、栈、队列和STL
数组 数组是一种最基本的数据结构,它是内存上的一块连续存储空间.正因如此数组的随机访问很方便.但数组也有其固有的限制,大小分配后不能改变. STL中的数组 STL中的Array是静态数组模板,就是我们 ...
随机推荐
- 测试member和coupon的远程调用
测试member和coupon的远程调用 想要获取当前会员领取到的所有优惠券.先去注册中心找优惠券服务, 注册中心调一台优惠券服务器给会员,会员服务器发送请求给这台优 惠券服务器,然后对方响应. Fe ...
- 设计模式之设计模式概述-shejimoshigaishu
title: 设计模式之设计模式概述 date: 2022-12-04 00:21:18.469 updated: 2022-12-11 23:03:45.617 url: https://www.y ...
- CentOS 7.3 操作系统 详解安装手册
CentOS 7.3 操作系统 安装手册 在安装ESPC前(绿盟WAF.IPS等外置日志中心),需要确保已经在计算机中正确安装CentOS 7.3 x86_64(内核版本为3.10.0-514.el7 ...
- 听说生鲜领军企业k8s集群都上云了,鱼会飞了?
在这个中秋都和国庆在一起的双节里,我们的小明还在辛辛苦苦的找工作,听说他经历了一段"难忘"的面试. 小明面对着面试官的"层层拷问",游刃有余的化解了这些难题. ...
- 构建健康游戏环境:DFA算法在敏感词过滤的应用
现在的游戏有敏感词检测这一点,相信大家也不陌生了,不管是聊天,起名,签名还是简介,只要是能让玩家手动输入的地方,一定少不了敏感词识别,至于识别之后是拒绝修改还是星号替换,这个就各有各的做法了,但是绕不 ...
- 如何使用 Node.js Stream API 减少服务器端内存消耗?
摘要:让我们看一个示例,展示在内存消耗方面,采用流的编程思路带来的巨大优越性. 本文分享自华为云社区<使用 Node.js Stream API 减少服务器端内存消耗的一个具体例子>,作者 ...
- 鸿蒙轻内核源码分析:虚拟文件系统 VFS
本文分享自华为云社区<鸿蒙轻内核M核源码分析系列二一 01 虚拟文件系统VFS>,作者:zhushy . VFS(Virtual File System)是文件系统的虚拟层,它不是一个实际 ...
- vue2升级vue3: TSX Vue 3 Composition API Refs
在vue2时代,$refs 直接操作子组件 this.$refs.gridlayout.$children[index]; 虽然不推荐这么做,但是确实非常好用.但是vue2快速迁移到vue3,之前的这 ...
- Hudi Bucket Index 在字节跳动的设计与实践
由字节跳动数据湖团队贡献的 RFC-29 Bucket Index 在近期合入 Hudi 主分支,本文详细介绍 Hudi Bucket Index 产生的背景与实践经验.字节跳动数据湖团队持续招人中, ...
- 火山引擎 DataTester:在广告投放场景下的 A/B 实验实践
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 "我知道在广告上的投资有一半是无用的,但问题是我不知道是哪一半." --零售大亨约翰·沃纳梅克 ...