约瑟夫问题:使用顺序链表实现
当然可以使用顺序链表来完成约瑟夫问题。下面是使用顺序链表实现的代码示例:
package link;
import list.ListInterface;
public class yuesefuSeqList<T> implements ListInterface<T> {
private Object[] element; // 存储数据的数组
private int size; // 顺序链表的长度
public yuesefuSeqList(int capacity) {
if (capacity < 0) {
throw new IllegalArgumentException('容量不能为负数');
}
element = new Object[capacity];
size = 0;
}
@Override
public void printlist() {
for (int i = 0; i < size; i++) {
System.out.print(element[i] + ' ');
}
System.out.println();
}
@Override
public int length() {
return size;
}
@Override
public int locate(T element) {
for (int i = 0; i < size; i++) {
if (this.element[i].equals(element)) {
return i + 1; // 返回位置时从1开始计数
}
}
return -1; // 未找到返回-1
}
@Override
public T getElement(int i) {
if (i < 1 || i > size) {
throw new IndexOutOfBoundsException('位置错误');
}
return (T) element[i - 1];
}
@Override
public void insert(int i, T element) {
if (i < 1 || i > size + 1) {
throw new IndexOutOfBoundsException('位置错误');
}
if (size == this.element.length) {
expandCapacity(); // 扩容
}
for (int j = size - 1; j >= i - 1; j--) {
this.element[j + 1] = this.element[j];
}
this.element[i - 1] = element;
size++;
}
@Override
public T delete(int i) {
if (i < 1 || i > size) {
throw new IndexOutOfBoundsException('位置错误');
}
T deletedElement = (T) element[i - 1];
for (int j = i; j < size; j++) {
element[j - 1] = element[j];
}
size--;
return deletedElement;
}
@Override
public boolean inEmpty() {
return size == 0;
}
private void expandCapacity() {
Object[] newElement = new Object[element.length * 2];
System.arraycopy(element, 0, newElement, 0, size);
element = newElement;
}
public int findSurvivor(int k) {
if (k < 1 || size < 1) {
return -1;
}
int current = 0;
while (size > 1) {
current = (current + k - 1) % size;
for (int i = current; i < size - 1; i++) {
element[i] = element[i + 1];
}
size--;
}
return (int) element[0];
}
public static void main(String[] args) {
yuesefuSeqList<Integer> list = new yuesefuSeqList<>(41);
int n = 41; // 总人数
int k = 3; // 报数到k的人被杀死
for (int i = 1; i <= n; i++) {
list.insert(i, i);
}
int survivor = list.findSurvivor(k);
System.out.println('幸存者的位置是:' + survivor);
}
}
输出结果:
幸存者的位置是:31
因此,约瑟夫和他的朋友站在位置31才保住了性命。
原文地址: https://www.cveoy.top/t/topic/C0R 著作权归作者所有。请勿转载和采集!