日期:2014-05-20  浏览次数:20960 次

求大虾解析
public class TestCount{
public static void main(String[] args){
kidCicrle kc = new kidCicrle(0);
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 right;
kid left;

}

class kidCicrle{
int count = 0;
kid first,last;

kidCicrle(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;
last = k;
}
count++;
}

void delete(kid k){
if(count <= 0){
System.out.println("error");
}else if(count == 1){
first = last = null;
}
else{
k.left.right = k.right;
k.right.left = k.left;
if(k == first){
first = k.right;
}
if(k == last){
last = k.left;
}
}
count--;
}
}





程序编译能通过,但运行时却抛出异常
Exceprion in thread "main" java.lang.NullpointerException
  at kidCicrle.delete<TestCount.java:62>
  at TesrCount.main<TestCount.java:10>

------解决方案--------------------
Exceprion in thread "main" java.lang.NullpointerException
at kidCicrle.delete<TestCount.java:62>

这两句话,你没考虑有可能 k.left为null 以及 k.right为null 的特殊情况:
k.left.right = k.right;
k.right.left = k.left;
------解决方案--------------------
Java code

public class TestCount {
    public static void main(String[] args) {
        kidCicrle kc = new kidCicrle(20);
        int countNum = 0;
        kid k = kc.first;
        while (kc.count>0&&k!=null){//加k!=null约束
            countNum++;
            if (countNum == 3){
                countNum = 0;
                kc.delete(k);
            }
            k = k.son;
        }
        for(kid k1 = kc.first;k1 != null;k1 = k1.son){//链表遍历
            System.out.print(k1.id +" ");
        }
    }
}
class kid {
    int id = 0;
    kid father = null;
    kid son = null;
}

class kidCicrle {
    int count = 0;
    kid first = null;
    kid last = null;
    kidCicrle(int n) {
        for (int i = 0;i<n;i++){//你赋值为0,对照你自己的程序
            add();
        }
    }
    
    void add() {
        kid k = new kid();
        k.id = count;
        if (count==0){
            first=k;
            last=k;
            first.son = last;
            last.father = first;
        }
        else{
            k.father = last;//注意双向都要连,避免照成空指针异常
            last.son = k;
            last = k;
        }
        count++;
    }
    void delete(kid k){
        if (count <= 0){
            System.out.println("error");
        }else if (count==1){
            first = null;
            last = null;
        }else {//双向链表,把引用搞清楚。
            if (k==first){
                k.son.father = null;
                first = k.son;
            }
            else if (k==last){
                k.father.son=null;
                last = k.father;
            }
            else{
                k.son.father = k.father;
                k.father.son = k.son;
            }
        }
        count--;
    }
}