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的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一 ...
随机推荐
- 微信模板消息 PHP
微信SDK: <?php class Oauth { //获得全局access_token public function get_token(){ //如果已经存在直接返回access_tok ...
- 春秋云镜 - CVE-2022-32991
靶标介绍: 该CMS的welcome.php中存在SQL注入攻击. 访问页面,先注册,使用邮箱加密码登录. bp抓包,后台挂上sqlipy然后去测welcome.php,常用的语句都没成功但过一会就有 ...
- shell的变量
变量含义 学生时代所学的数学方程式,如x=1,y=2,那会称之为x,y是未知数 对于计算机角度,x=1,y=2等于定义了两个变量,名字分别是x,y,且赋值了1和2 变量是暂时存储数据的地方,变量临时存 ...
- B 树和 B+ 树及其实现
B 树 B 树和一般的二叉树有许多相似的地方,二者都是为了加快查找的速度,不同之处在于 B 树是为了解决大量的数据而产生的,更加适合读取相对大的数据块的存储系统.B 树的每个节点一般不会存储实际的数据 ...
- Docker本地部署Firefox火狐浏览器并远程访问
Docker本地部署Firefox火狐浏览器并远程访问 Firefox是一款免费开源的网页浏览器,由Mozilla基金会开发和维护.它是第一个成功挑战微软Internet Explorer浏览器垄断地 ...
- SSH默认端口从22修改为其他端口
1.在终端中使用root权限登录到您的Linux服务器. 2.打开终端,并使用适合您的文本编辑器(如vi.nano等)打开SSH配置文件.例如,通过运行以下命令之一: vi /etc/ssh/sshd ...
- Nginx unexpected end of file 配置证书遇到问题,如何解决?
原文链接 https://bysocket.com/nginx-unexpected-end-of-file-expecting-in-key-file/ 一.Nginx unexpected end ...
- 技术解读丨GaussDB数仓高可用容灾利器之逻辑备份
摘要:GaussDB数仓的Roach工具,同时提供物理备份和逻辑备份两种主要形态的备份.逻辑备份针对数据库的逻辑对象进行抽取和备份,能够有效地应对单表.schema级等较细粒度的备份,较为灵活和便利. ...
- 为什么MySQL单表不能超过2000万行?
摘要:MySQL一张表最多能存多少数据? 本文分享自华为云社区<为什么MySQL单表不能超过2000万行?>,作者: GaussDB 数据库 . 最近看到一篇<我说MySQL每张表最 ...
- 手把手带你通过API创建一个loT边缘应用
摘要:使用API Arts&API Explorer调用IoT边缘服务接口创建应用,了解边缘计算在物联网行业的应用. 本文分享自华为云社区<使用API Arts&API Expl ...