• 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()
    }
    

      

  • 相关阅读:
    测试用例模板和编写目的
    使用AndroidStudio配置码云时,提醒following remotes are already on gitee git
    win10操作系统查看电池损耗,电池使用时间
    windows技巧03----win的一些组合键
    windows技巧02---------输入特殊字符
    windows技巧01------------记事本默认保存修改时间
    word2010如何让第一页不显示页码
    docker镜像管理基础
    docker基础用法
    SaltStack进阶
  • 原文地址:https://www.cnblogs.com/2bjiujiu/p/14430562.html
Copyright © 2020-2023  润新知