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是静态数组模板,就是我们 ...
随机推荐
- CUDA驱动深度学习发展 - 技术全解与实战
全面介绍CUDA与pytorch cuda实战 关注TechLead,分享AI全维度知识.作者拥有10+年互联网服务架构.AI产品研发经验.团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云 ...
- 轻量化动态编译库 Natasha v8.0 正式发布!
.NET8.0 与 动态编译 Hello 各位小伙伴,我于 2024年1月10日 发布了 Natasha 一个全新的里程碑版本 v8.0,对于老用户而言,此次发布版本号跨度较大,是因为我决定使用新的版 ...
- 我开源了一个 Go 学习仓库
目录 前言 一.综述 1.1 Hello Word 1.2 命令行参数 1.3 查找重复行 1.4 GIF 动画 1.5 获取一个URL 1.6 并发获取多个URL 1.7 实现一个 Web 服务器 ...
- vue遮罩层
<template> <div class="hello"> <button @click="toggleModal">打开 ...
- 最新系统MacOs13 Ventura(M1/M2芯片) + Parallels Desktop 18(PD18史上最强虚拟机)永久使用攻略
众神殿内,高朋满座,胜友如云,Vmware.VirtualBox.Utm等虚拟机大神群英荟萃,只见位于C位王座上的Parallels怅惘抬头,缓缓逡巡,睥睨群小,目光到处,无人敢抬头对视. 是的,如果 ...
- CodeArts TestPlan:一站式测试管理平台
摘要:华为云正式发布CodeArts TestPlan,这是一款自主研发的一站式测试管理平台,沉淀了华为30多年高质量的软件测试工程方法与实践,覆盖测试计划.测试设计.测试执行和测试评估等全流程. 本 ...
- 跟我读论文丨ACL2021 NER 模块化交互网络用于命名实体识别
摘要:本文是对ACL2021 NER 模块化交互网络用于命名实体识别这一论文工作进行初步解读. 本文分享自华为云社区<ACL2021 NER | 模块化交互网络用于命名实体识别>,作者: ...
- 超详细的 Jenkins 安全tips
Jenkins 作为一个开放的.可定制的平台,即使在默认状态下也提供了不错的安全性.但是鉴于 Jenkins 连接了许多行业工具,因此也存在一定安全隐患.本篇文章将会介绍一些方法和工具,来确保 Jen ...
- Axure 表格中根据条件设置不同的字体样式--中继器
中继器+表格,根据条件设置不同的字体样式 思路:根据情形,设置不同的颜色,因为Axure 不能直接对元件的样式进行交互设置,所以借助[动态面板]进行设置 绘制表格详见:https://www.cnbl ...
- 消息总线 —— SpringCloud Bus
Bus 简介 Spring Cloud Bus 是 Spring Cloud 体系内的消息总线,支持 RabbitMQ 和 Kafka 两种消息中间件.所谓消息总线,简单理解就是一个消息中心,众多微服 ...