else if (count == 1) {
first = last = null;
}
这里不明白,还忘指点
void delete(Kid k) {
if(count <= 0) {
System.out.println("没小孩可以删了");
} else if (count == 1) {
first = last = null;
}else {
k.left.right = k.right;
k.right.left = k.left;

if(k == first) {
first = k.right;
}else if(k == last) {
last = k.left;
}
}

count --;
}还有打印的时候为什么是打印第一个小孩,视频说就剩下第一个小孩了,看了半天代码,没看出来为什么?
public static void main(String[] args) {
KidCircle kc = new KidCircle(500);
int countNum = 0;
Kid k = kc.first;

while(kc.count > 1) {
countNum ++;
if(countNum == 3) {
countNum = 0;
kc.delete(k);
}
k = k.right;
}
System.out.println(kc.first.id);
}

解决方案 »

  1.   

    全部代码  
    public class Count3Quit22 {
    public static void main(String[] args) {
    KidCircle kc = new KidCircle(500);
    int countNum = 0;
    Kid k = kc.first;

    while(kc.count > 1) {
    countNum ++;
    if(countNum == 3) {
    countNum = 0;
    kc.delete(k);
    }
    k = k.right;
    }
    System.out.println(kc.first.id);
    }
    }class Kid {
    int id;
    Kid left;
    Kid right;
    }class KidCricle {
    int count = 0;
    Kid first;
    Kid last;

    KidCricle (int n) {
    for(int i=0; i<n; i++) {
    add();
    }
    }

    void add() {
    Kid k = new Kid();
    k.id = count;

    if(count <= 0) {
    first = k;
    last = k;
    k.right = k;
    k.left = k;
    }else {
    last.right = k;
    k.right = first;
    first.left = k;
    last = k;
    }
    count ++;
    }

    void delete(Kid k) {
    if(count <= 0) {
    System.out.println("没小孩可以删了");
    } else if (count == 1) {
    first = last = null;
    }else {
    k.left.right = k.right;
    k.right.left = k.left;

    if(k == first) {
    first = k.right;
    }else if(k == last) {
    last = k.left;
    }
    }

    count --;
    }
    }
      

  2.   

    k = k.right; 能放到delete方法里面吗? 我试了几个地方都不行,感觉要是能放方法里面更简洁,
      

  3.   

    本质上是循环链表算法。k = k.right; 能放到delete方法里面吗?
    ——你这个问题指的是main函数里面这段吧            while(kc.count > 1) {
                    countNum ++;
                    if(countNum == 3) {
                        countNum = 0;
                        kc.delete(k);    
                    }
                    k = k.right;        
                }这里k相当于是当前输到哪个小孩,这个操作不能放入delete;因为无论是否退出一个小孩,你都要继续数下一个小孩的。如果你非要调整,最多只能调整成为这样子:
                while(kc.count > 1) {
                    countNum ++;
                    if(countNum == 3) {
                        countNum = 0;
                        k = kc.delete(k); // 该函数需要增加 return k.right;
                    } else {
                        k = k.right;
                    }
                }
      

  4.   

    count --; 要放到if里面去
    否则在count<=0的时候仍然会执行count--在没有判断k是否为last或者first的时候,直接执行下面两行是很危险的。因为first没有left,last没有right
                k.left.right = k.right;
                k.right.left = k.left; 
      

  5.   

    else if (count == 1) {
    first = last = null; 
    }
    这里不明白,还忘指点
      

  6.   

    链表的header算一个,所以如果count==1的话,就是没元素了,first=last=null;
      

  7.   


    count==1 也就意味着,当前这个循环链表里面其实只剩下最后一个小孩了,对吧?这种情况下,其实不需要再做那种拆链条的做法了,直接把链首和链尾清空,就相当于已经把链表的最后一个节点删除了。想想看是不是这样?否则你还有更好的做法删除这个循环链表中的最后一个节点么?^_^
      

  8.   

    楼主没搞明白先后顺序啊。count值是当前的状态。判断count==1时,说明当前还有一个小孩,也就是说在调用delete方法前还有1个小孩,这个时候再调用delete方法。就是没有小孩了。当然会有first = last = null;了。而实际运行时,当还剩一个小孩的时候,就不会再调用delete方法了。当然这个delete方法并不完善。当前count==0时,虽然输出了System.out.println("没小孩可以删了");    
    但是count--仍然执行了,也就是说count会变成负数,虽然不影响你的程序的运行。但是作为教程的话这种错误是要不得的。换句话说,count等于0和1本身就对功能的实现没有影响,做这个判断就是想让程序完整一些,但居然还存在问题,不知道你看的什么教程,真垃圾。
      

  9.   

    while(kc.count > 1) {
    .....
         kc.delete(k);    
    .....        
    }
    这段代码你懂吧。就是说kc这个对象中count值大于1的时候,才可能调用delete方法。所以在delete方法内,count==1是走不到的。
      

  10.   


    楼主啊,程序里面虽然delete函数处理了只有1个小孩的情况,那是为了链表的算法完整性而写的;并不意味着每一行代码都一定会在这个例子里面发挥它的价值(被执行)。在你的例子里面,最后只剩下1个小孩的时候,根本就不会再调用到delete了,因为主程序就退出循环结束掉了,你看看主程序的循环条件是:
    while(kc.count > 1) {