方法一在单向循环链表内部解决
public void josephusLoop(){
if (size<=2){
return;
}
Node p=head;
while (size!=2){
p=p.next;
//删除结点
Node del=p.next;
if (del==head){
head=head.next;
}else if (del==tail){
tail=p;
}
p.next=del.next;
del.next=null;
size--;
p=p.next;
}
}
测试类
public class JosephusLoop {
public static void main(String[] args) {
LinkedSinglyCircularList<Integer> list=new LinkedSinglyCircularList<>();
for (int i=1;i<=41;i++){
list.add(i);
}
System.out.println(list);
list.josephusLoop();
System.out.println(list);
}
}
执行结果
LinkedSinglyList:41[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41]
LinkedSinglyList:2[16,31]
方法二在外部进行解决
public class JosephusLoop {
public static void main(String[] args) {
LinkedSinglyCircularList<Integer> list=new LinkedSinglyCircularList<>();
for (int i=1;i<=41;i++){
list.add(i);
}
System.out.println(list);
//list.josephusLoop();
/*
p=0
p=(p+2)%size()
*/
int p=0;
while (list.size()!=2){
p=(p+2)%list.size();
list.remove(p);
}
System.out.println(list);
}
}
执行结果
LinkedSinglyList:41[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41]
LinkedSinglyList:2[16,31]