逢三退一(双向回环链表算法) 中的疑惑
** 用面向对象方法实现(双向回环链表算法)
*
* 逢三退一:一个头和尾相连的圆形数字队列,从第一个开始数,数到三,
* 就把三的那个去掉,然后接着数,如此循环,逢三退一。
* 直到最后一个为止,求最后一个是数字队列中的第几个?
*/
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位置的孩子就会被删除? --------------------编程问答-------------------- 刚才看到楼主每个版都发一个,分多啊
还不如一个帖多发点分
就是个圆环,然后数数 --------------------编程问答-------------------- 我是昨天才注册的 才看到可用分的事。。。不过能得到解惑多少分也值了
圆环数数的话你这么说我还是不太能理解 first 起到一个什么样的作用呢?我脑子比较笨,要是有形象语言描述下我会理解的更好些 --------------------编程问答-------------------- 数数总要从某个地方开始数,
自己可以用笔在纸上画个图模拟下就容易理解了
补充:Java , Java EE