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-单链表-栈和队列的更多相关文章

  1. Python实现栈、队列

    目录 1. 栈的Python实现 1.1 以列表的形式简单实现栈 1.2 以单链表形式实现栈 2. 队列的Python实现 2.1 以列表实现简单队列 2.2 以单链表形式实现队列   本文将使用py ...

  2. Linux内核链表复用实现队列

    有了前面Linux内核复用实现栈的基础,使用相同的思想实现队列,也是非常简单的.普通单链表复用实现队列,总会在出队或入队的时候有一个O(n)复杂度的操作,大多数采用增加两个变量,一个head,一个ta ...

  3. 线性表:实现单链表和子类栈(Stack)及单向队列(Queue) [C++]

    刚刚开始学习c++.之前c的内容掌握的也不多,基本只是一本概论课的程度,以前使用c的struct写过的链表.用python写过简单的数据结构,就试着把两者用c++写出来,也是对c++的class,以及 ...

  4. java实现单链表、栈、队列三种数据结构

    一.单链表 1.在我们数据结构中,单链表非常重要.它里面的数据元素是以结点为单位,每个结点是由数据元素的数据和下一个结点的地址组成,在java集合框架里面 LinkedList.HashMap(数组加 ...

  5. 栈和队列----将单链表的每K个节点之间逆序

    将单链表的每K个节点之间逆序 给定一个单链表的头节点head,实现一个调整链表的函数,使得每K 个节点之间逆序,如果最后剩下不够K 个节点,则不调整最后几个. 例如: 链表:1—>2—>3 ...

  6. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  7. 数据结构(c语言第2版)-----了解链表,栈,队列,串

    关于链表我觉得这都是最基本的东西,但是不常见,在实际的应用中很少的使用,了解它会用就OK,不需要研究的那么深,除非做那种内存压缩,存储方面工作. C语言中动态申请空间 malloc() q=(dlin ...

  8. &10 基本数据结构——栈,队列和链表

    #1,栈(stack) 定义[来自百度]:栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素 ...

  9. 线性表 及Java实现 顺序表、链表、栈、队列

    数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...

  10. 数组、链表、栈、队列和STL

    数组 数组是一种最基本的数据结构,它是内存上的一块连续存储空间.正因如此数组的随机访问很方便.但数组也有其固有的限制,大小分配后不能改变. STL中的数组 STL中的Array是静态数组模板,就是我们 ...

随机推荐

  1. CUDA驱动深度学习发展 - 技术全解与实战

    全面介绍CUDA与pytorch cuda实战 关注TechLead,分享AI全维度知识.作者拥有10+年互联网服务架构.AI产品研发经验.团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云 ...

  2. 轻量化动态编译库 Natasha v8.0 正式发布!

    .NET8.0 与 动态编译 Hello 各位小伙伴,我于 2024年1月10日 发布了 Natasha 一个全新的里程碑版本 v8.0,对于老用户而言,此次发布版本号跨度较大,是因为我决定使用新的版 ...

  3. 我开源了一个 Go 学习仓库

    目录 前言 一.综述 1.1 Hello Word 1.2 命令行参数 1.3 查找重复行 1.4 GIF 动画 1.5 获取一个URL 1.6 并发获取多个URL 1.7 实现一个 Web 服务器 ...

  4. vue遮罩层

    <template> <div class="hello"> <button @click="toggleModal">打开 ...

  5. 最新系统MacOs13 Ventura(M1/M2芯片) + Parallels Desktop 18(PD18史上最强虚拟机)永久使用攻略

    众神殿内,高朋满座,胜友如云,Vmware.VirtualBox.Utm等虚拟机大神群英荟萃,只见位于C位王座上的Parallels怅惘抬头,缓缓逡巡,睥睨群小,目光到处,无人敢抬头对视. 是的,如果 ...

  6. CodeArts TestPlan:一站式测试管理平台

    摘要:华为云正式发布CodeArts TestPlan,这是一款自主研发的一站式测试管理平台,沉淀了华为30多年高质量的软件测试工程方法与实践,覆盖测试计划.测试设计.测试执行和测试评估等全流程. 本 ...

  7. 跟我读论文丨ACL2021 NER 模块化交互网络用于命名实体识别

    摘要:本文是对ACL2021 NER 模块化交互网络用于命名实体识别这一论文工作进行初步解读. 本文分享自华为云社区<ACL2021 NER | 模块化交互网络用于命名实体识别>,作者: ...

  8. 超详细的 Jenkins 安全tips

    Jenkins 作为一个开放的.可定制的平台,即使在默认状态下也提供了不错的安全性.但是鉴于 Jenkins 连接了许多行业工具,因此也存在一定安全隐患.本篇文章将会介绍一些方法和工具,来确保 Jen ...

  9. Axure 表格中根据条件设置不同的字体样式--中继器

    中继器+表格,根据条件设置不同的字体样式 思路:根据情形,设置不同的颜色,因为Axure 不能直接对元件的样式进行交互设置,所以借助[动态面板]进行设置 绘制表格详见:https://www.cnbl ...

  10. 消息总线 —— SpringCloud Bus

    Bus 简介 Spring Cloud Bus 是 Spring Cloud 体系内的消息总线,支持 RabbitMQ 和 Kafka 两种消息中间件.所谓消息总线,简单理解就是一个消息中心,众多微服 ...