约瑟夫josephu问题
描述
设编号为1、2、3……n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,报数为m的人出列;之后相邻的下一位又从1开始报数,报数为m的人又出列。以此类推,直到所有人出列为止,由此产生一个出队编号的序列。
实现
package mainimport "fmt"type student struct {id intnext *student
}// 遍历
// func check(start_node *student, current_node *student) {
// if current_node.next != start_node {
// fmt.Printf("本节点的id为%d\n", current_node.id)
// check(start_node, current_node.next)
// } else {
// fmt.Printf("最后节点的id为%d\n", current_node.id)
// }
// }// 删除
func delete(current_node *student, n int, m int) {if (m == 1) && (n > 1) {// k_node就是目标节点的前一个节点,所以不用m的挪位prev := current_nodedest := current_node.nextnxt := current_node.next.nextdest.next = nilprev.next = nxtfmt.Printf("出列节点的id为%d,前一节点%d的next指针已经指向后一节点%d,地址为%p\n", dest.id, prev.id, nxt.id, prev.next)delete(prev, n-1, m)}if (m >= 2) && (n > 1) {// 因为移动m-1次,到达目标m,所以移动m-2次,到达目标节点的前一个节点for i := 1; i <= (m - 2); i++ {current_node = current_node.next}prev := current_nodedest := current_node.nextnxt := current_node.next.nextdest.next = nilprev.next = nxtfmt.Printf("出列节点的id为%d,前一节点%d的next指针已经指向后一节点%d,地址为%p\n", dest.id, prev.id, nxt.id, prev.next)delete(prev.next, n-1, m)}if n == 1 {current_node.next = nilfmt.Printf("最后出列节点的id为%d,地址为%p\n", current_node.id, current_node.next)}}func main() {var n int = 44var k int = 6// var m int = 1// var m int = 2var m int = 14// 生成// 临时结构体previous_node := &student{}// 第一个结构体s1 := &student{id: 1}previous_node = s1for i := 2; i <= n; i++ {s := &student{id: i}previous_node.next = s// 挪位previous_node = s}// 成环:最后一个结构体的next指针指向第一个结构体previous_node.next = s1// check(s1, s1)k_node := &student{}if m >= 2 {// 先移动k-1次,到达编号为k的节点temp_node := s1for i := 1; i <= (k - 1); i++ {temp_node = temp_node.next}k_node = temp_node}if m == 1 {// 先移动k-2次,到达编号为k-1的节点temp_node := s1for i := 1; i <= (k - 2); i++ {temp_node = temp_node.next}k_node = temp_node}delete(k_node, n, m)
}
m = 1出列节点的id为6,前一节点5的next指针已经指向后一节点7,地址为0xc000024100
出列节点的id为7,前一节点5的next指针已经指向后一节点8,地址为0xc000024110
出列节点的id为8,前一节点5的next指针已经指向后一节点9,地址为0xc000024120
出列节点的id为9,前一节点5的next指针已经指向后一节点10,地址为0xc000024130
出列节点的id为10,前一节点5的next指针已经指向后一节点11,地址为0xc000024140
出列节点的id为11,前一节点5的next指针已经指向后一节点12,地址为0xc000024150
出列节点的id为12,前一节点5的next指针已经指向后一节点13,地址为0xc000024160
出列节点的id为13,前一节点5的next指针已经指向后一节点14,地址为0xc000024170
出列节点的id为14,前一节点5的next指针已经指向后一节点15,地址为0xc000024180
出列节点的id为15,前一节点5的next指针已经指向后一节点16,地址为0xc000024190
出列节点的id为16,前一节点5的next指针已经指向后一节点17,地址为0xc0000241a0
出列节点的id为17,前一节点5的next指针已经指向后一节点18,地址为0xc0000241b0
出列节点的id为18,前一节点5的next指针已经指向后一节点19,地址为0xc0000241c0
出列节点的id为19,前一节点5的next指针已经指向后一节点20,地址为0xc0000241d0
出列节点的id为20,前一节点5的next指针已经指向后一节点21,地址为0xc0000241e0
出列节点的id为21,前一节点5的next指针已经指向后一节点22,地址为0xc0000241f0
出列节点的id为22,前一节点5的next指针已经指向后一节点23,地址为0xc000024200
出列节点的id为23,前一节点5的next指针已经指向后一节点24,地址为0xc000024210
出列节点的id为24,前一节点5的next指针已经指向后一节点25,地址为0xc000024220
出列节点的id为25,前一节点5的next指针已经指向后一节点26,地址为0xc000024230
出列节点的id为26,前一节点5的next指针已经指向后一节点27,地址为0xc000024240
出列节点的id为27,前一节点5的next指针已经指向后一节点28,地址为0xc000024250
出列节点的id为28,前一节点5的next指针已经指向后一节点29,地址为0xc000024260
出列节点的id为29,前一节点5的next指针已经指向后一节点30,地址为0xc000024270
出列节点的id为30,前一节点5的next指针已经指向后一节点31,地址为0xc000024280
出列节点的id为31,前一节点5的next指针已经指向后一节点32,地址为0xc000024290
出列节点的id为32,前一节点5的next指针已经指向后一节点33,地址为0xc0000242a0
出列节点的id为33,前一节点5的next指针已经指向后一节点34,地址为0xc0000242b0
出列节点的id为34,前一节点5的next指针已经指向后一节点35,地址为0xc0000242c0
出列节点的id为35,前一节点5的next指针已经指向后一节点36,地址为0xc0000242d0
出列节点的id为36,前一节点5的next指针已经指向后一节点37,地址为0xc0000242e0
出列节点的id为37,前一节点5的next指针已经指向后一节点38,地址为0xc0000242f0
出列节点的id为38,前一节点5的next指针已经指向后一节点39,地址为0xc000024300
出列节点的id为39,前一节点5的next指针已经指向后一节点40,地址为0xc000024310
出列节点的id为40,前一节点5的next指针已经指向后一节点41,地址为0xc000024320
出列节点的id为41,前一节点5的next指针已经指向后一节点42,地址为0xc000024330
出列节点的id为42,前一节点5的next指针已经指向后一节点43,地址为0xc000024340
出列节点的id为43,前一节点5的next指针已经指向后一节点44,地址为0xc000024350
出列节点的id为44,前一节点5的next指针已经指向后一节点1,地址为0xc0000240a0
出列节点的id为1,前一节点5的next指针已经指向后一节点2,地址为0xc0000240b0
出列节点的id为2,前一节点5的next指针已经指向后一节点3,地址为0xc0000240c0
出列节点的id为3,前一节点5的next指针已经指向后一节点4,地址为0xc0000240d0
出列节点的id为4,前一节点5的next指针已经指向后一节点5,地址为0xc0000240e0
最后出列节点的id为5,地址为0x0
m = 2出列节点的id为7,前一节点6的next指针已经指向后一节点8,地址为0xc000024110
出列节点的id为9,前一节点8的next指针已经指向后一节点10,地址为0xc000024130
出列节点的id为11,前一节点10的next指针已经指向后一节点12,地址为0xc000024150
出列节点的id为13,前一节点12的next指针已经指向后一节点14,地址为0xc000024170
出列节点的id为15,前一节点14的next指针已经指向后一节点16,地址为0xc000024190
出列节点的id为17,前一节点16的next指针已经指向后一节点18,地址为0xc0000241b0
出列节点的id为19,前一节点18的next指针已经指向后一节点20,地址为0xc0000241d0
出列节点的id为21,前一节点20的next指针已经指向后一节点22,地址为0xc0000241f0
出列节点的id为23,前一节点22的next指针已经指向后一节点24,地址为0xc000024210
出列节点的id为25,前一节点24的next指针已经指向后一节点26,地址为0xc000024230
出列节点的id为27,前一节点26的next指针已经指向后一节点28,地址为0xc000024250
出列节点的id为29,前一节点28的next指针已经指向后一节点30,地址为0xc000024270
出列节点的id为31,前一节点30的next指针已经指向后一节点32,地址为0xc000024290
出列节点的id为33,前一节点32的next指针已经指向后一节点34,地址为0xc0000242b0
出列节点的id为35,前一节点34的next指针已经指向后一节点36,地址为0xc0000242d0
出列节点的id为37,前一节点36的next指针已经指向后一节点38,地址为0xc0000242f0
出列节点的id为39,前一节点38的next指针已经指向后一节点40,地址为0xc000024310
出列节点的id为41,前一节点40的next指针已经指向后一节点42,地址为0xc000024330
出列节点的id为43,前一节点42的next指针已经指向后一节点44,地址为0xc000024350
出列节点的id为1,前一节点44的next指针已经指向后一节点2,地址为0xc0000240b0
出列节点的id为3,前一节点2的next指针已经指向后一节点4,地址为0xc0000240d0
出列节点的id为5,前一节点4的next指针已经指向后一节点6,地址为0xc0000240f0
出列节点的id为8,前一节点6的next指针已经指向后一节点10,地址为0xc000024130
出列节点的id为12,前一节点10的next指针已经指向后一节点14,地址为0xc000024170
出列节点的id为16,前一节点14的next指针已经指向后一节点18,地址为0xc0000241b0
出列节点的id为20,前一节点18的next指针已经指向后一节点22,地址为0xc0000241f0
出列节点的id为24,前一节点22的next指针已经指向后一节点26,地址为0xc000024230
出列节点的id为28,前一节点26的next指针已经指向后一节点30,地址为0xc000024270
出列节点的id为32,前一节点30的next指针已经指向后一节点34,地址为0xc0000242b0
出列节点的id为36,前一节点34的next指针已经指向后一节点38,地址为0xc0000242f0
出列节点的id为40,前一节点38的next指针已经指向后一节点42,地址为0xc000024330
出列节点的id为44,前一节点42的next指针已经指向后一节点2,地址为0xc0000240b0
出列节点的id为4,前一节点2的next指针已经指向后一节点6,地址为0xc0000240f0
出列节点的id为10,前一节点6的next指针已经指向后一节点14,地址为0xc000024170
出列节点的id为18,前一节点14的next指针已经指向后一节点22,地址为0xc0000241f0
出列节点的id为26,前一节点22的next指针已经指向后一节点30,地址为0xc000024270
出列节点的id为34,前一节点30的next指针已经指向后一节点38,地址为0xc0000242f0
出列节点的id为42,前一节点38的next指针已经指向后一节点2,地址为0xc0000240b0
出列节点的id为6,前一节点2的next指针已经指向后一节点14,地址为0xc000024170
出列节点的id为22,前一节点14的next指针已经指向后一节点30,地址为0xc000024270
出列节点的id为38,前一节点30的next指针已经指向后一节点2,地址为0xc0000240b0
出列节点的id为14,前一节点2的next指针已经指向后一节点30,地址为0xc000024270
出列节点的id为2,前一节点30的next指针已经指向后一节点30,地址为0xc000024270
最后出列节点的id为30,地址为0x0
m = 14出列节点的id为19,前一节点18的next指针已经指向后一节点20,地址为0xc0000241d0
出列节点的id为33,前一节点32的next指针已经指向后一节点34,地址为0xc0000242b0
出列节点的id为3,前一节点2的next指针已经指向后一节点4,地址为0xc0000240d0
出列节点的id为17,前一节点16的next指针已经指向后一节点18,地址为0xc0000241b0
出列节点的id为32,前一节点31的next指针已经指向后一节点34,地址为0xc0000242b0
出列节点的id为4,前一节点2的next指针已经指向后一节点5,地址为0xc0000240e0
出列节点的id为20,前一节点18的next指针已经指向后一节点21,地址为0xc0000241e0
出列节点的id为36,前一节点35的next指针已经指向后一节点37,地址为0xc0000242e0
出列节点的id为8,前一节点7的next指针已经指向后一节点9,地址为0xc000024120
出列节点的id为25,前一节点24的next指针已经指向后一节点26,地址为0xc000024230
出列节点的id为42,前一节点41的next指针已经指向后一节点43,地址为0xc000024340
出列节点的id为15,前一节点14的next指针已经指向后一节点16,地址为0xc000024190
出列节点的id为35,前一节点34的next指针已经指向后一节点37,地址为0xc0000242e0
出列节点的id为10,前一节点9的next指针已经指向后一节点11,地址为0xc000024140
出列节点的id为29,前一节点28的next指针已经指向后一节点30,地址为0xc000024270
出列节点的id为6,前一节点5的next指针已经指向后一节点7,地址为0xc000024100
出列节点的id为27,前一节点26的next指针已经指向后一节点28,地址为0xc000024250
出列节点的id为5,前一节点2的next指针已经指向后一节点7,地址为0xc000024100
出列节点的id为28,前一节点26的next指针已经指向后一节点30,地址为0xc000024270
出列节点的id为9,前一节点7的next指针已经指向后一节点11,地址为0xc000024140
出列节点的id为34,前一节点31的next指针已经指向后一节点37,地址为0xc0000242e0
出列节点的id为14,前一节点13的next指针已经指向后一节点16,地址为0xc000024190
出列节点的id为41,前一节点40的next指针已经指向后一节点43,地址为0xc000024340
出列节点的id为24,前一节点23的next指针已经指向后一节点26,地址为0xc000024230
出列节点的id为12,前一节点11的next指针已经指向后一节点13,地址为0xc000024160
出列节点的id为43,前一节点40的next指针已经指向后一节点44,地址为0xc000024350
出列节点的id为31,前一节点30的next指针已经指向后一节点37,地址为0xc0000242e0
出列节点的id为22,前一节点21的next指针已经指向后一节点23,地址为0xc000024200
出列节点的id为16,前一节点13的next指针已经指向后一节点18,地址为0xc0000241b0
出列节点的id为11,前一节点7的next指针已经指向后一节点13,地址为0xc000024160
出列节点的id为7,前一节点2的next指针已经指向后一节点13,地址为0xc000024160
出列节点的id为13,前一节点2的next指针已经指向后一节点18,地址为0xc0000241b0
出列节点的id为21,前一节点18的next指针已经指向后一节点23,地址为0xc000024200
出列节点的id为30,前一节点26的next指针已经指向后一节点37,地址为0xc0000242e0
出列节点的id为40,前一节点39的next指针已经指向后一节点44,地址为0xc000024350
出列节点的id为23,前一节点18的next指针已经指向后一节点26,地址为0xc000024230
出列节点的id为1,前一节点44的next指针已经指向后一节点2,地址为0xc0000240b0
出列节点的id为44,前一节点39的next指针已经指向后一节点2,地址为0xc0000240b0
出列节点的id为18,前一节点2的next指针已经指向后一节点26,地址为0xc000024230
出列节点的id为39,前一节点38的next指针已经指向后一节点2,地址为0xc0000240b0
出列节点的id为26,前一节点2的next指针已经指向后一节点37,地址为0xc0000242e0
出列节点的id为38,前一节点37的next指针已经指向后一节点2,地址为0xc0000240b0
出列节点的id为37,前一节点2的next指针已经指向后一节点2,地址为0xc0000240b0
最后出列节点的id为2,地址为0x0