/**
* @author cnkeysky
* @date 2020-02-19 14:26
*/
public class Josepfu<T> {
private Node<T> header;
private Node<T> rear;
private int count = 0;
public Josepfu() {
header = new Node<>();
rear = header;
}
private static class Node<T> {
T data;
Node<T> next;
public Node() {
}
public Node(T data) {
this.data = data;
this.next = null;
}
@Override
public String toString() {
return data + "";
}
}
public void add(T val) {
rear.next = new Node<>(val);
rear = rear.next;
// 构成循环单链表
rear.next = header.next;
++count;
}
public T remove(int index) {
if (index < 0 || index >= count) {
throw new RuntimeException("out of bounds");
}
Node<T> p = header;
T val;
for (int i = 0; i < count && i < index; ++i) {
p = p.next;
}
if (index < count - 1) {
val = p.next.data;
p.next = p.next.next;
} else {
val = p.next.data;
p.next = header.next;
rear = p;
}
--count;
return val;
}
/**
* 处理约瑟夫问题
* @param start 从几号开始
* @param step 数几下
* @return String 所有出圈顺序
*/
public String startJosepfu(int start, int step) {
StringBuilder builder = new StringBuilder();
while (size() != 1) {
int index = (start + step - 2) % size();
T val = remove(index);
builder.append(val).append(",");
start = (index + 1) % size();
}
builder.append(remove(0));
return builder.toString();
}
public int size() {
if (count < 0) {
count = 0;
}
return count;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
Node<T> p = header;
for (int i = 0; i < count; ++i) {
p = p.next;
builder.append(p.data);
if (i < count - 1) {
builder.append(",");
}
}
return builder.toString();
}
}
约瑟夫问题-Java
最新推荐文章于 2020-03-10 13:43:32 发布