Go-环形链表
package main import "fmt" // 环形单向链表
// 特征: 首尾相连
// 实现: 结构体 + 指针
// 1. 构建环形单向链表,类似单向链表,不过head指针存储值,并且链表尾部与头部相连
// 2. 环形单向链表添加节点则需要一个辅助节点 currentNode 指向环形最后一个节点,然后在该节点后面增加节点并将该节点指向头节点
// a. 处理情况:空链表
// 3. 删除节点: 1. 找到该节点的上一个节点,然后判断是否是头节点,然后将上一个节点指向该节点对应的下一个节点
// a. 处理情况: 空链表、链表中只有一个元素
// b. 难点是如果找到想要删除的节点、删除节点对应的上一个节点、删除的节点对象是头节点怎么处理 // Player 定义玩家,环形结构中每个节点对象
type Player struct {
No int
Name string
next *Player
} // Game 游戏
type Game struct {
// head指向环形单向链表的第一个元素
head *Player
// head指向环形单向链表的第最后个元素
tail *Player
} func NewGame() *Game {
return &Game{}
} // AddPlayer 添加玩家
func (g *Game) AddPlayer(p *Player) {
// 1. 判断是否是空链表
if g.head == nil {
g.head = p
g.tail = p
// 1个人形成环
p.next = p
} else {
// 2. 添加到最后
g.tail.next = p
// 3. tail指向最后元素
g.tail = p
// 4. 最后元素指向初始头节点
p.next = g.head
}
} // ListPlayer 列出所有玩家
func (g *Game) ListPlayer() {
tmp := g.head
for {
fmt.Println(tmp)
tmp = tmp.next
if tmp == g.head {
break
}
}
} // Play 玩家开始游戏,从某个玩家开始,然后再数多少为,玩家出局
func (g *Game) Play(startNo int, num int) (p *Player) {
// 1. 判断链表是否为空
if g.head == nil {
fmt.Println("该游戏没有玩家")
return nil
}
// 2. 如果只有一个玩家,则直接出局
if g.head.next == g.head {
p = g.head
g.head.next = nil
g.head = nil
g.tail = nil
return
}
// 3. 指定开始玩家
for i := 1; i <= startNo-1; i ++ {
g.head, g.tail = g.head.next, g.tail.next
}
// 4. 指定出局玩家
for i := 1; i <= num-1; i ++ {
g.head, g.tail = g.head.next, g.tail.next
}
// 5. head指向的就是出局玩家
p = g.head
// 6. 在单向链表中移除该玩家
g.tail.next = g.head.next
g.head = g.tail.next
return
} func main() {
pl2 := Player{
No: 0,
Name: "tom",
}
pl3 := Player{
No: 2,
Name: "alex",
}
pl4 := Player{
No: 3,
Name: "xueli",
}
pl5 := Player{
No: 0,
Name: "yang",
} g := NewGame()
g.AddPlayer(&pl2)
g.AddPlayer(&pl3)
g.AddPlayer(&pl4)
g.AddPlayer(&pl5)
g.ListPlayer()
fmt.Println("-------------------------")
outPlayer := g.Play(3, 10)
fmt.Println("出局玩家:", outPlayer.Name)
g.ListPlayer()
}
Go-环形链表的更多相关文章
- 丢手帕问题(环形链表)---Java 待优化
/** * * @author Administrator * 功能:丢手帕问题 */ package com.litao; public class Demo4 { /** * @param arg ...
- php实现单,双向链表,环形链表解决约瑟夫问题
传智播客PHP学院 韩顺平 PHP程序员玩转算法第一季 http://php.itcast.cn 聊天篇: 数学对我们编程来说,重不重要? 看你站在什么样的层次来说. 如果你应用程序开发,对数学要求 ...
- PHP算法学习(8) 环形链表 解决约瑟夫问题
2019年2月25日17:29:17 Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆圈 ...
- 用c语言创建双向环形链表
作为一个C开发人员,无论在求职笔试题中,还是在工程项目中,都会遇到用c语言创建双向环形链表.这个也是理解和使用c指针的一项基本功. #include<...>//头文件省略 typedef ...
- java 环形链表实现约瑟夫(Joseph)问题
约瑟夫问题又名丢手绢问题.相传著名犹太历史学家 Josephus 利用其规则躲过了一场自杀游戏,而后投降了罗马. 问题: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.* 从编号为 ...
- 关于HashMap多线程下环形链表的总结
目录 1. 概述 2. 敲黑板的点 3. 为什么会出现循环链表的情况呢?(jdk1.7) 4. jdk1.8中改进了resize方法 5. HashMap的线程安全问题 6. 总结 1. 概述 本文主 ...
- 【LeetCode题解】141_环形链表
目录 141_环形链表 描述 解法一:哈希表 思路 Java 实现 Python 实现 解法二:双指针(龟兔算法) 思路 Java 实现 Python 实现 141_环形链表 描述 给定一个链表,判断 ...
- Leecode刷题之旅-C语言/python-141环形链表
/* * @lc app=leetcode.cn id=141 lang=c * * [141] 环形链表 * * https://leetcode-cn.com/problems/linked-li ...
- Leetcode:环形链表2
题目 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 解答 这道题真的很巧妙,首先我们有了环形链表1这道题的铺垫,就能方便的判断有无环了,但是题目要求我们找到环形链表的 ...
- C# 数据结构 - 单链表 双链表 环形链表
链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一 ...
随机推荐
- OpenEuler22.03安装最新版本Docker
一.环境及问题 操作系统环境如下: 操作系统:OpenEuler 22.03 LTS 安装方式:最小化安装 在操作系统安装完毕如果直接采用dnf或者yum方式安装docker: sudo dnf in ...
- Liquid 常用语法记录
一.什么是 Liquid Liquid 是一款专为特定需求而打造的模板引擎. Liquid 中有两种类型的标记:Output 和 Tag. Output 通常用来显示文本 {{ 两个花括号 }} Ta ...
- 2023-08-16:用go语言如何解决进击的骑士算法问题呢?
2023-08-16:用go写算法.一个坐标可以从 -infinity 延伸到 +infinity 的 无限大的 棋盘上, 你的 骑士 驻扎在坐标为 [0, 0] 的方格里. 骑士的走法和中国象棋中的 ...
- GetX GetUtils
GetUtils 是 getx 为我们提供一些常用的工具类库,包括值是否为空.是否是数字.是否是视频.图 片.音频.PPT.Word.APK.邮箱.手机号码.日期.MD5.SHA1等等. class ...
- spring-mvc 系列:拦截器和异常处理器(HandlerInterceptor、HandlerExceptionResolver)
目录 一.拦截器的配置 二.拦截器的三个抽象方法 三.多个拦截器的执行顺序 四.基于配置的异常处理器 五.基于注解的异常处理器 一.拦截器的配置 SpringMVC中的拦截器用于拦截控制器方法的执行 ...
- Altas&Ranger快速入门
Altas&Ranger快速入门 一.元数据 企业内部远行多种类型的数据库,有关系型数据库.非关系型数据库.图数据库.时序数据库等,常见有mysql.redis.Mongodb.oracle. ...
- Boost程序库完全开发指南:1.1-C++基础知识点梳理
主要整理了N多年前(2010年)学习C++的时候开始总结的知识点,好长时间不写C++代码了,现在LLM量化和推理需要重新学习C++编程,看来出来混迟早要还的. 1.shared_ptr 解析:sh ...
- 详解Vue八大生命周期钩子函数
摘要:Vue为生命周期中的每个状态都设置了钩子函数(监听函数) .每当Vue实例处于不同的生命周期时,对应的函数就会被触发调用. 本文分享自华为云社区<一文带你弄懂Vue八大生命周期钩子函数&g ...
- 揭秘华为云GaussDB(for Influx):最佳实践之数据建模
摘要:本期将从GaussDB(for Influx)数据模型谈起,分享GaussDB(for Influx)数据建模的最佳方法,避免一些使用过程中的常见问题. 本文分享自华为云社区<华为云Gau ...
- YoloV5实战:手把手教物体检测
摘要:YOLOv5并不是一个单独的模型,而是一个模型家族,包括了YOLOv5s.YOLOv5m.YOLO... 本文分享自华为云社区<YoloV5实战:手把手教物体检测--YoloV5> ...