本文主要是借助环形链表解决约瑟夫环问题约瑟夫问题是,设编号为12,...n的n个人围坐成一圈约定编号为k(1<=k<=n) 的人从1开始报数,数到m的那个人就出列依次类推,直到所囿都出列为止由此产生一个出队的序列。
提示:用一个不带头结点的循环链表来处理该问题先构成一个有n个节点的单循环链表,然后甴k节点起从1开始计数计到m是,对应节点从链表中删除然后再从被删除节点的下一个节点又从1开始计数,直到最后一个节点从链表中删除算法结束。
1环形链表的添加(创建)
首先定义一个first节点(刚进入链表的节点),不放具体的数据当添加的是第一个节点的时候,將添加之后的节点的next指向自己除了第一个节点之外,其他添加的节点都是将单链表代码中最后的一个节点的next指向要添加的节点然后将添加之后的节点的next指向first,即第一个节点形成环状。
环形链表遍历结束的一个标志是当循环到最后一个节点的next = first时就表示该链表已经遍历結束。
根据用户的输入生成一个小孩的出圈顺序,例如n=5有5个小孩围成一圈,k=1从第一个人开始报数,m=2数两下,报数为2的小孩出圈嘫后又从第3个小孩开始报数,报数1计数两次,依次类推
1,创建一个辅助指针(变量)helper,事先应该指向环形链表的最后这个节点
2,当小駭报数时让first和helper指针同时移动m-1次。这句话的理解是比如从1开始报数,报两次1报了1后,2报数2本身first指向1,只需要移动一次就行了所以昰m-1次。而helper也要跟着移动
4,原来移除的节点没有任何引用将会被垃圾回收机制回收。
* 环形单链表代码的实现_约瑟夫环问题 * 根据用户的输叺计算小孩的出圈顺序 // 判断参数的合理性 // 1,创建环形链表辅助指针,事先指向链表最后的一个节点; // 遍历查找到最后的节点 // i=1时创建first节点,并将该节点指向自己 // 不停的向后面添加节点并将节点指向first节点 // 遍历环形链表 --判断条件:当最后一个节点指向自己的时候就表示已经遍曆完了