约瑟夫链表
一、思路
二、源码
1.节点
代码如下(示例):
package CircleSingleLinkedList;
public class Boy {
private int no;
private Boy Next;
public Boy(int no){
this.no=no;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public Boy getNext() {
return Next;
}
public void setNext(Boy next) {
Next = next;
}
}
2.约瑟夫链表
代码如下(示例):
package CircleSingleLinkedList;
public class CircleSingleLinkedList {
//创建一个头结点first
private Boy first = null;
public void addBoy(int num) {
if (num < 1) {
System.out.println("输入数据无效,添加不了元素");
}
//创建一个临时指针cur
Boy cur = null;
for (int i = 1; i <= num; i++) {
Boy boy = new Boy(i);
if (i == 1) {
first = boy;
first.setNext(first); //让头节点与头节点连接起来
cur = boy; //然新指针指向每次加进来的boy这个节点
}
cur.setNext(boy); // 让临时节点的下一个指向新加进来的boy
boy.setNext(first); //新加进来的boy的下一个节点指向头部
cur = boy; //临时节点后移
}
}
//遍历整个环形链表
public void list() {
//如果环形链表为空,则不遍历
if (first == null) {
System.out.println("环形链表为空");
}
//需要一个临时指针来遍历
Boy cur = first;
while (true) {
System.out.printf("小孩的编号为%d\n", cur.getNo());
if (cur.getNext() == first) {
break;
}
cur = cur.getNext();
}
}
//小孩出圈思路
public void getout(int num, int k, int m) {
//验证数据
if (first == null || k > num || k < 1) {
System.out.println("参数输入有误。");
return;
}
//创建一个辅助指针helper,事先应该让其指向环形链表的最后一个节点
Boy helper = first;
while (true) {
if (helper.getNext() == first) {
break;
}
helper = helper.getNext();
}
//报数前,先让first和helper移动 k-1 次
for (int i = 0; i < k - 1; i++) {
first = first.getNext();
helper = helper.getNext();
}
while (first != helper) {
//当报数时,让first和helper指针同时移动m-1次
for (int i = 0; i < m - 1; i++) {
first = first.getNext();
helper = helper.getNext();
}
System.out.printf("出圈的人是%d\n", first.getNo());
first = first.getNext();
helper.setNext(first);
}
System.out.printf("最后留在圈中的小孩编号为%d", first.getNo());
}
}
验证Demo
代码如下(示例):
package CircleSingleLinkedList;
public class CircleSingleLinkedLIstDemo {
public static void main(String[] args) {
CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();
circleSingleLinkedList.addBoy(5);
circleSingleLinkedList.list();
circleSingleLinkedList.getout(5,1,2);
}
}
总结
思路理清楚就行了,看图说话~