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是静态数组模板,就是我们 ...
随机推荐
- MinIO客户端之share
MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc share mc share download mc share upload 生成下载对象的URL,指定对 ...
- Kiractf
信息收集 主机发现和端口扫描只开放了80的web服务 WEB打点 访问首页有文件上传,肯定可以利用一波.language那个页面甚至文件包含都写脸上了. root@Lockly tmp/ki ...
- GetX GetUtils
GetUtils 是 getx 为我们提供一些常用的工具类库,包括值是否为空.是否是数字.是否是视频.图 片.音频.PPT.Word.APK.邮箱.手机号码.日期.MD5.SHA1等等. class ...
- Asp .Net Core系列:Exceptionless简介和部署(Windows、Linux、Docker)
目录 一.简介 二.版本 三.运行说明 1.Exceptionless 2.Elasticsearch 3.Exceptionless.UI 四.打包Exceptionless.UI 五.window ...
- CUDA C编程权威指南:1.1-CUDA基础知识点梳理
主要整理了N多年前(2013年)学习CUDA的时候开始总结的知识点,好长时间不写CUDA代码了,现在LLM推理需要重新学习CUDA编程,看来出来混迟早要还的. 1.CUDA 解析:2007年,NV ...
- MySQL基础篇:第八章_详解TCL语言
事务 一.含义 事务:一条或多条sql语句组成一个执行单位,一组sql语句要么都执行要么都不执行 二.特点(ACID) A 原子性:一个事务是不可再分割的整体,要么都执行要么都不执行 C 一致性:一个 ...
- 深度解读鸿蒙轻内核CPU占用率
摘要:CPUP(Central Processing Unit Percentage,CPU占用率)分为系统CPU占用率和任务CPU占用率.用户通过系统级的CPU占用率,判断当前系统负载是否超出设计规 ...
- Mac Parallels (PD) 常规设置
Mac 上安装了 Parallels (PD) 程序默认使用 Parallels 打开,比较烦人,取消设置: 虚机中不显示 mac 的菜单栏 ,按 Control + Option 就会临时显示 备份 ...
- Spring 学习笔记(2)框架介绍
本篇文章主要对 Spring 框架进行整体介绍,包括其核心功能模块与体系结构,让大家对该框架有个大体的认识. 1. 前景提要 如果你之前学过 Servlet 的话,那么一定会对 MVC 分层概念有所了 ...
- Codeforces Round #674 (Div. 3) (A - F题题解)
A. Floor Number https://codeforces.com/contest/1426/problem/A 题意: 一个楼房房间号由 \(1\) 递增,一楼仅2个房间.给定一位用户的房 ...