注:环形链表添加,遍历、约瑟夫环问题
public class ttt {
public static void main(String[] args) {
Circle c = new Circle();
for (int i = 1; i < 6; i++) {
c.add(new Men(i));
}
// c.add(new Men(2));
// c.add(new Men(1));
// c.add(new Men(3));
// c.show();
// c.del(1, 2, 5);
// c.del(1, 2, 25);
c.del(1, 2, 5);
c.show();
System.out.println(c.size);
}
}
class Circle {
Men m = new Men(0);
public int size;// 有效数据个数
// 添加
public void add(Men men) {
Men first = m;
// 只有一个数据时
if (first.next == null) {
size++;
m = men;
m.next = men;
return;
}
while (first.next != null) {
first = first.next;
if (first.next == m) {
break;
}
}
size++;
first.next = men;
men.next = m;
}
public void del(int start, int num, int length) {
if (start < 0 || start > size || length > size) {
return;
}
Men first = m;
// 从start 开始
for (int i = 1; i < start; i++) {
first = first.next;
}
int count = 1;
while (length != 1) {
count++;
if (count == num) {
System.out.println(first.next);
first.next = first.next.next;
count = 1;
length--;
}
first = first.next;
}
m = first.next;
System.out.println("最后一个" + first);
}
// 遍历环形链表
public void show() {
if (m.next == m) {
System.out.println(m);
return;
}
Men first = m;
while (first.next != null) {
System.out.println(first);
// 等于第一个数据时退出
if (first.next == m) {
return;
}
first = first.next;
}
}
}
class Men {
public int id;
public Men next;
public Men(int id) {
this.id = id;
}
@Override
public String toString() {
return "Men [id=" + id + "]";
}
}
输出:
Men [id=2]
Men [id=4]
Men [id=1]
Men [id=5]
最后一个Men [id=3]
Men [id=3]
5