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的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一 ...
随机推荐
- Socket.D 替代 Http 协议像 Ajax 一样开发前端接口
我们在"前端接口"开发时,使用 socket.d 协议有什么好处: 功能上可以替代 http 和原生 ws 更安全!现有的工具想抓包数据,难!难!难!(socket.d 是个新的二 ...
- 【scikit-learn基础】--『监督学习』之 贝叶斯分类
贝叶斯分类是一种统计学分类方法,基于贝叶斯定理,对给定的数据集进行分类.它的历史可以追溯到18世纪,当时英国统计学家托马斯·贝叶斯发展了贝叶斯定理,这个定理为统计决策提供了理论基础. 不过,贝叶斯分类 ...
- kubernetes web管理页面安装(二)
参考文件: https://cloud.tencent.com/developer/article/1919416 参考命令: https://blog.51cto.com/smbands/49038 ...
- websocket实现实时直播
websocket实现实时直播 这篇文章我首发于简书,拿到这里发表不过分吧?点个赞再走呗! 作为一名web开发者,我使用websocket实现实时直播(滑鸡版). 为什么是滑鸡版呢?因为他上不了生产, ...
- Linux 多路复用(多路转接)
出现原因 如果需要从一个文件描述符中读取数据,然后将数据写入到另一个文件描述符时,可以按照如下的阻塞 IO : while ((n = read(STDIN_FILENO, buf, BUFFER_S ...
- macOS 安装 clang-tidy
先安装 homebrew,网上教程很多,推荐官方教程,此处略过 通过 brew 安装 llvm brew install llvm 创建软连接,指向 homebrew 安装的 clang-tidy m ...
- GetX GetUtils
GetUtils 是 getx 为我们提供一些常用的工具类库,包括值是否为空.是否是数字.是否是视频.图 片.音频.PPT.Word.APK.邮箱.手机号码.日期.MD5.SHA1等等. class ...
- C++中自定义结构体或类作为关联容器的键
目录 1. 概述 2. 实例 1. 概述 STL中像set和map这样的容器是通过红黑树来实现的,插入到容器中的对象是顺序存放的,采用这样的方式是非常便于查找的,查找效率能够达到O(log n).所以 ...
- 爬取Discuz!社区的教程标题
爬取Discuz!社区的教程标题-史上最详细解析(实现分页) 摘要:本文记录了爬取Discuz!社区的教程标题的详细过程,过程清晰 这是O的第一篇博客,如有排版问题请大佬见谅,O非常希望大佬能在评论区 ...
- 云小课|打造企业数据“高内聚,低耦合”--试试GaussDB(DWS)逻辑集群,实现数据物理隔离
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:逻辑集群是基于No ...