*
* 用面向对象方法实现(双向回环链表算法)
*
* 逢三退一:一个头和尾相连的圆形数字队列,从第一个开始数,数到三,
* 就把三的那个去掉,然后接着数,如此循环,逢三退一。
* 直到最后一个为止,求最后一个是数字队列中的第几个?
*/ public class Count3Quit2
{
public static void main(String[] args)
{
KidCircle kc = new KidCircle(500); int num = 0; Kid k = kc.first; //从第一个开始数数 while (kc.count > 1)
{
num++; //数数 if (num == 2) // 从0开始的,数到2就是第三个数字了
{
kc.delete(k); //删除当前的k
num = 0; //重新数数
} k = k.right; //k右孩子赋给k
} System.out.println(kc.first.id); // 打印最后的一个孩子的id }
} class Kid
{
int id = 0; // 孩子号码
Kid left; // 左边的孩子
Kid right; // 右边的孩子
} class KidCircle
{
int count = 0;
Kid first;
Kid last; // 构造函数,构造n个孩子围成的圈
public KidCircle(int n)
{
for (int i = 0; i < n; i++)
{
add(); // 调用add方法,循环一次增加一个孩子
}
} // 添加孩子
public void add()
{
Kid k = new Kid();
k.id = count; if (count <= 0)
{
first = k; // 只有一个孩子
last = k;
k.left = k;
k.right = k;
}
else
{
last.right = k; // 从最后的节点开始,k成为last的右边孩子
k.left = last; // last成为k的左边孩子
k.right = first; // k成为first的右边孩子
first.left = k; // k成为first的左边孩子
last = k; // 这时候k变成了最后一个
} count++;
} // 删除孩子
public void delete(Kid k)
{
if (count <= 0) // 没有孩子
{
return;
}
else if (count == 1) // 只剩一个孩子
{
first = last = null;
}
else
{
k.left.right = k.right; // k的右孩子成为 k的左孩子 的右边孩子
k.right.left = k.left; // k的左孩子成为 k的右孩子 的左边孩子 if (k == first) // 如果k是第一个孩子first
{
first = k.right;
}
else if (k == last) // 如果k是第一个孩子last
{
last = k.left;
}
} count--;
}
}
=====================================================================
我想问的是:
while (kc.count > 1)
{
num++; //数数 if (num == 2) // 从0开始的,数到2就是第三个数字了
{
kc.delete(k); //删除当前的k
num = 0; //重新数数
} k = k.right; //k右孩子赋给k
} System.out.println(kc.first.id); // 打印最后的一个孩子的id }
这段代码表达的意思我不太理解,很难把它想象成一个具体的动态图形。
这是不是说first是KidCircle中一个固定的位置,每count一个Kid,该Kid就向前走一步,后面的跟上。数到3时,first位置的孩子就会被删除?
* 用面向对象方法实现(双向回环链表算法)
*
* 逢三退一:一个头和尾相连的圆形数字队列,从第一个开始数,数到三,
* 就把三的那个去掉,然后接着数,如此循环,逢三退一。
* 直到最后一个为止,求最后一个是数字队列中的第几个?
*/ public class Count3Quit2
{
public static void main(String[] args)
{
KidCircle kc = new KidCircle(500); int num = 0; Kid k = kc.first; //从第一个开始数数 while (kc.count > 1)
{
num++; //数数 if (num == 2) // 从0开始的,数到2就是第三个数字了
{
kc.delete(k); //删除当前的k
num = 0; //重新数数
} k = k.right; //k右孩子赋给k
} System.out.println(kc.first.id); // 打印最后的一个孩子的id }
} class Kid
{
int id = 0; // 孩子号码
Kid left; // 左边的孩子
Kid right; // 右边的孩子
} class KidCircle
{
int count = 0;
Kid first;
Kid last; // 构造函数,构造n个孩子围成的圈
public KidCircle(int n)
{
for (int i = 0; i < n; i++)
{
add(); // 调用add方法,循环一次增加一个孩子
}
} // 添加孩子
public void add()
{
Kid k = new Kid();
k.id = count; if (count <= 0)
{
first = k; // 只有一个孩子
last = k;
k.left = k;
k.right = k;
}
else
{
last.right = k; // 从最后的节点开始,k成为last的右边孩子
k.left = last; // last成为k的左边孩子
k.right = first; // k成为first的右边孩子
first.left = k; // k成为first的左边孩子
last = k; // 这时候k变成了最后一个
} count++;
} // 删除孩子
public void delete(Kid k)
{
if (count <= 0) // 没有孩子
{
return;
}
else if (count == 1) // 只剩一个孩子
{
first = last = null;
}
else
{
k.left.right = k.right; // k的右孩子成为 k的左孩子 的右边孩子
k.right.left = k.left; // k的左孩子成为 k的右孩子 的左边孩子 if (k == first) // 如果k是第一个孩子first
{
first = k.right;
}
else if (k == last) // 如果k是第一个孩子last
{
last = k.left;
}
} count--;
}
}
=====================================================================
我想问的是:
while (kc.count > 1)
{
num++; //数数 if (num == 2) // 从0开始的,数到2就是第三个数字了
{
kc.delete(k); //删除当前的k
num = 0; //重新数数
} k = k.right; //k右孩子赋给k
} System.out.println(kc.first.id); // 打印最后的一个孩子的id }
这段代码表达的意思我不太理解,很难把它想象成一个具体的动态图形。
这是不是说first是KidCircle中一个固定的位置,每count一个Kid,该Kid就向前走一步,后面的跟上。数到3时,first位置的孩子就会被删除?
解决方案 »
- hash值
- javacomm20-win32.zip——配置好驱动后,怎么配置系统环境变量?
- java读取文件问题???
- 各位java 高手进,可能关于反射,散分跪求
- 问一个关于软件发布的问题,很急,在线等答案
- jsp无法设置断点的问题
- 如何使用draw方法画饼型图、扇形图、折线图???
- 创建新文件时为何老报异常信息
- 请教JFrame的setState(int)的用法,1是最小化窗体,几是最大化?希望将JFrame窗口最大化。用Toolkit的getScreenSize取的窗体并不是最大的
- Q:在APPLICATION中如何显示图片和播放*.au文件?????????????
- 阿里巴巴的面试题之一,谁能解释解释
- 关于递归的一个小问题,找不到程序问题出哪里了
public class Count3Quit {
public static void main(String[] args) {
boolean[] a = new boolean[500];
for (int i = 0; i < a.length; i++) {
a[i] = true;
}
int index;
int count = 0;
int len = a.length;
for (index = 0; len > 1; index++) {
if (a[index] == true) {
count++;
if (count == 3) {
count = 0;
a[index] = false;
len--;
}
}
if (index == a.length - 1) {
index = -1;
}
} for (int i = 0; i < a.length; i++) {
if (a[i] == true) {
System.out.print(i + 1);
}
}
}
}