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-环形链表的更多相关文章

  1. 丢手帕问题(环形链表)---Java 待优化

    /** * * @author Administrator * 功能:丢手帕问题 */ package com.litao; public class Demo4 { /** * @param arg ...

  2. php实现单,双向链表,环形链表解决约瑟夫问题

    传智播客PHP学院 韩顺平 PHP程序员玩转算法第一季  http://php.itcast.cn 聊天篇: 数学对我们编程来说,重不重要? 看你站在什么样的层次来说. 如果你应用程序开发,对数学要求 ...

  3. PHP算法学习(8) 环形链表 解决约瑟夫问题

    2019年2月25日17:29:17 Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆圈 ...

  4. 用c语言创建双向环形链表

    作为一个C开发人员,无论在求职笔试题中,还是在工程项目中,都会遇到用c语言创建双向环形链表.这个也是理解和使用c指针的一项基本功. #include<...>//头文件省略 typedef ...

  5. java 环形链表实现约瑟夫(Joseph)问题

    约瑟夫问题又名丢手绢问题.相传著名犹太历史学家 Josephus 利用其规则躲过了一场自杀游戏,而后投降了罗马. 问题: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.* 从编号为 ...

  6. 关于HashMap多线程下环形链表的总结

    目录 1. 概述 2. 敲黑板的点 3. 为什么会出现循环链表的情况呢?(jdk1.7) 4. jdk1.8中改进了resize方法 5. HashMap的线程安全问题 6. 总结 1. 概述 本文主 ...

  7. 【LeetCode题解】141_环形链表

    目录 141_环形链表 描述 解法一:哈希表 思路 Java 实现 Python 实现 解法二:双指针(龟兔算法) 思路 Java 实现 Python 实现 141_环形链表 描述 给定一个链表,判断 ...

  8. Leecode刷题之旅-C语言/python-141环形链表

    /* * @lc app=leetcode.cn id=141 lang=c * * [141] 环形链表 * * https://leetcode-cn.com/problems/linked-li ...

  9. Leetcode:环形链表2

    题目 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 解答 这道题真的很巧妙,首先我们有了环形链表1这道题的铺垫,就能方便的判断有无环了,但是题目要求我们找到环形链表的 ...

  10. C# 数据结构 - 单链表 双链表 环形链表

    链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一 ...

随机推荐

  1. kubernetes之部署war项目(二)

    kubernetes之部署war项目(二) k8s系列 源自我工作上的实际场景,记录于此. 现在老项目是war包形式,需要基于tomcat部署,因此在打包镜像时将tomcat带上的. 假设我的war项 ...

  2. Sermant重磅更新,1.3.0 release版本发布

    本文分享自华为云社区<新特性速览!Sermant重磅更新,1.3.0 release版本发布>,作者:华为云开源. Sermant社区在12月份正式发布了1.3.0 release版本,这 ...

  3. 教你如何优雅的改写“if-else”

    摘要:这些场景,你是怎么写的代码? if-else,这是个再正常不过的coding习惯,当我们代码量小的时候用来做条件判断是再简单不过的了.但对于优秀程序员来说,这却不是好代码. 不信你往下看- 1. ...

  4. Python图像处理丨带你掌握图像几何变换

    摘要:本篇文章主要讲解图像仿射变换和图像透视变换,通过Python调用OpenCV函数实. 本文分享自华为云社区<[Python图像处理] 十二.图像几何变换之图像仿射变换.图像透视变换和图像校 ...

  5. 如何实现数据流畅转换?火山引擎ByteHouse推出ELT能力

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   在数据分析场景中,企业使用的数据通常具备来源多样化的特点,如支付交易记录.用户行为等,且数据格式各异,有的为行 ...

  6. 智定义、易调整,火山引擎DataLeap助力企业轻松实现全流程值班管理

     更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   近日,火山引擎大数据研发治理套件DataLeap全新上线值班管理模块,企业可通过该模块体系化智能化创建值班计 ...

  7. Axure 辅助线--栅格化布局

    全局辅助线 在所有页面都会显示,比如主页面是框架.子页面通过[内联框架]去加载,为了子页面的元件不偏移,可以创建创建全局辅助线 页面辅助线

  8. 最优订单执行算法相关Paper介绍

    更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 随着量化交易.高频交易的竞争日益激烈,事实证明,交易执行显着影响量化策略的投资绩效. 因此,许多从业者开 ...

  9. 阿里云云通信作为 CPaaS 全球代表服务商,上榜 Gartner 报告

    近日,国际知名研究机构Gartner发布2022年<CPaaS市场指南(Market Guide for Communications Platform as a Service, 2022)& ...

  10. 【JAVA基础】MySQL配置

    mySQL配置 数据库连接 初始化配置 --创建用户 并授权 create user 'injasup'@'%' identified by 'supplier@2023#!'; GRANT SELE ...