当前位置:编程学习 > JAVA >>

逢三退一(双向回环链表算法) 中的疑惑


 * 用面向对象方法实现(双向回环链表算法) 
 *   
 * 逢三退一:一个头和尾相连的圆形数字队列,从第一个开始数,数到三, 
 * 就把三的那个去掉,然后接着数,如此循环,逢三退一。 
 * 直到最后一个为止,求最后一个是数字队列中的第几个? 
 */ 

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位置的孩子就会被删除?
--------------------编程问答-------------------- 不用这么复杂吧
报到1和2的从队列移出,重新插入队列末尾
报到3的直接移出队列
反复操作,直到队列长度为1
--------------------编程问答-------------------- 这个自己画个图模拟一遍,然后就能理解了 --------------------编程问答-------------------- 变形约瑟夫环 --------------------编程问答-------------------- java50题中就有一个相当类似的。。。
至于怎么理解,你弄上几个石子摆成一圈,照着程序一步一步的进行操作,不就知道了。
知道每一步了,最后的流程你也就明白了
补充:Java ,  Java相关
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,