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);
}
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);
}
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 --;
}
}
——你这个问题指的是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;
}
}
否则在count<=0的时候仍然会执行count--在没有判断k是否为last或者first的时候,直接执行下面两行是很危险的。因为first没有left,last没有right
k.left.right = k.right;
k.right.left = k.left;
first = last = null;
}
这里不明白,还忘指点
count==1 也就意味着,当前这个循环链表里面其实只剩下最后一个小孩了,对吧?这种情况下,其实不需要再做那种拆链条的做法了,直接把链首和链尾清空,就相当于已经把链表的最后一个节点删除了。想想看是不是这样?否则你还有更好的做法删除这个循环链表中的最后一个节点么?^_^
但是count--仍然执行了,也就是说count会变成负数,虽然不影响你的程序的运行。但是作为教程的话这种错误是要不得的。换句话说,count等于0和1本身就对功能的实现没有影响,做这个判断就是想让程序完整一些,但居然还存在问题,不知道你看的什么教程,真垃圾。
.....
kc.delete(k);
.....
}
这段代码你懂吧。就是说kc这个对象中count值大于1的时候,才可能调用delete方法。所以在delete方法内,count==1是走不到的。
楼主啊,程序里面虽然delete函数处理了只有1个小孩的情况,那是为了链表的算法完整性而写的;并不意味着每一行代码都一定会在这个例子里面发挥它的价值(被执行)。在你的例子里面,最后只剩下1个小孩的时候,根本就不会再调用到delete了,因为主程序就退出循环结束掉了,你看看主程序的循环条件是:
while(kc.count > 1) {