利用单向环形链表解决约瑟夫问题

栏目: 编程工具 · 发布时间: 7年前

内容简介:基本思路: 略!!:smile:玩一波:

利用单向环形链表解决约瑟夫问题

一开始我是想用list来解决的,但我想了很久都想不出来,只能用自定义的单向环形链表解决了。

基本思路: 略!!:smile:

直接上代码吧

//单向环形链表解决约瑟夫问题
package main

import "fmt"

//创建一个带自身指针的结构体
type node struct {
	no   int
	next *node
}

//创建两个标记变量,head标记第一个结点,tail标记最后一个结点
var head, tail *node

//追加结点
func addNode(n *node) {
	if tail == nil { 
		head = n
		n.next = head
		tail = n
	} else {
		tail.next = n
		n.next = head
		tail = n  //把链表最后一个的地址放到tail,即tail就是最后一个
	}
}

//约瑟夫环,从编号为k的人开始报数,数到num的那个人出列
func joseph(k, num int) {
	//记数变量
	count := 1

	//先移动到第k个人
	for i := 0; i < k-1; i++ {
		head = head.next
		tail = tail.next
	}

	//游戏从第k个人那里开始
	for {
		count++  //开始记数
		head = head.next
		tail = tail.next
		
		if count == num {
			//打印出数到num的人,并且让其出局
			fmt.Println(head.no, "号出局")
			tail.next = head.next
			head = head.next
			count = 1
		}

		//游戏剩最后一个人的时候结束
		if head == tail {
			fmt.Println(head.no, "号赢得了游戏")
			break
		}
	}
}

玩一波:

func main() {

	for i := 0; i < 5; i++ {
		n := &node{
			no: i + 1,
		}
		//追加结点
		addNode(n)
	}
	//从第一个人开始,数到3的那个人出列
	joseph(1, 3)

}

总结:golang自带的list是不是不能直接用来解决该问题(本人新手,望批评指正!!)

有哪位大神能用golang自带的list来解决吗?

如果确实不能用golang自带的list来解决,请给出个肯定的回答,好让我不要钻牛角尖


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

人月神话(40周年中文纪念版)

人月神话(40周年中文纪念版)

(美) 布鲁克斯(Brooks, F. P.) 著 / UML China翻译组,汪颖 译 / 清华大学出版社 / 2015-4-1 / 68.00元

在软件领域,很少能有像《人月神话》一样具有深远影响力和畅销不衰的著作。Brooks博士为人们管理复杂项目提供了最具洞察力的见解,既有很多发人深省的观点,又有大量软件工程的实践。本书内容来自Brooks博士在IBM公司SYSTEM/360家族和OS/360中的项目管理经验,该项目堪称软件开发项目管理的典范。该书英文原版一经面世,即引起业内人士的强烈反响,后又译为德、法、日、俄、中、韩等多种文字,全球......一起来看看 《人月神话(40周年中文纪念版)》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具