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. Vue学习笔记-介绍&双向绑定

  2. URL安全的Base64算法

    URL安全的Base64算法 base64是取3个字节(24位)的数据强行组成4个字节(32位)的数据做为一个分组,24位分成4个字节的话,每个字节分到6位,然后前面补两位0,然后这个字节的值位索引去 ...

  3. 简单几行实现sliver上线提醒

    准备魔改sliver去掉一些特征什么的,这里记录一下最简单实现上线消息通过企业微信机器人提醒的方式,这很简单也有很多不足还需要接着改的 protobuf中对消息Beacon和Session的定义如下, ...

  4. python异步编程之asyncio低阶API

    低阶API介绍 asyncio中低阶API的种类很多,涉及到开发的5个方面.包括: 获取事件循环 事件循环方法集 传输 协议 事件循环策略 本篇中只讲解asyncio常见常用的函数,很多底层函数如网络 ...

  5. 全国网络安全行业职业技能大赛云南省选拔赛 Misc 部分WP

    word_sercet 题目 我的解答: 加密文档,010打开图片发现密码 VVV_123.com 解压打开得到flag(注:flag原本是隐藏的,但我之前设置过隐藏文字自动显示,因此这里直接可以看到 ...

  6. vue音频(监听播放完成)

    <template> <div> <audio ref="audio" :src="audioSrc"></audio ...

  7. 手把手教您在PyCharm中连接云端资源进行代码调试

    摘要:ModelArts提供了一个PyCharm插件工具PyCharm ToolKit,协助用户完成代码上传.提交训练作业.将训练日志获取到本地展示等,用户只需要专注于本地的代码开发即可. 本文分享自 ...

  8. 论文复现丨基于ModelArts进行图像风格化绘画

    摘要:这个 notebook 基于论文「Stylized Neural Painting, arXiv:2011.08114.」提供了最基本的「图片生成绘画」变换的可复现例子. 本文分享自华为云社区& ...

  9. 带你梳理Roach全量恢复的整体流程

    摘要:本文将梳理Roach全量恢复的整体流程,描述Roach集群全量备份场景的运转机制. 数据备份恢复是保护数据安全的重要手段之一.Roach工具支持多种备份恢复类型,例如集群级的物理备份,表级备份的 ...

  10. IAP:物联网终端软件升级技术

    摘要:IAP是利用自己的程序代码实现升级程序(新的APP)从外部接口(可以是串口.I2C.SPI.网口等等)写入到flash中,再通过flash读写操作,将新的APP覆盖原有APP程序,在重新从新的A ...