该题是尚学堂马世兵老师经讲过的一道题,题目是这样的:
一群小孩围成一个圈,其中一个小孩从1开始报数,报到3的小孩退出,下一个小孩接着从1报数,直到剩下最后一个小孩,算出这名小孩是谁?
当时讲了两种方式,一种是数组的方式,一种是链表的方式,下面就讲一下链表的方式。
1.Kid类
代码:
/**
* 小孩
* @description Kid.class
* @author zkf
* @createTime 2013-7-16
*/
class Kid{
private int id;
private Kid left;//左手边小孩
private Kid right;//右手边小孩
public Kid(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Kid getLeft() {
return left;
}
public void setLeft(Kid left) {
this.left = left;
}
public Kid getRight() {
return right;
}
public void setRight(Kid right) {
this.right = right;
}
}
2.模拟一个双向链表
代码:
/**
* 链表
* @description LinkList.class
* @author zkf
* @createTime 2013-7-16
*/
class LinkList{
int count = 0;//大小
Kid last;//结尾
Kid first;//开头
/**
* 增加Kid
* @author zhangkefei
* @createTime 2013-7-16
* @return void
*/
public void add(Kid kid){
if(count == 0){
last = kid;
first = kid;
kid.setLeft(last);
kid.setRight(first);
}else {
kid.setLeft(last);
kid.setRight(first);
last.setRight(kid);
first.setLeft(kid);
last = kid;
}
count ++;
}
/**
* 移除一个Kid
* @author zhangkefei
* @createTime 2013-7-16
* @return void
*/
public void move(Kid kid){
if(count == 0){
return;
}else if(count == 1){
first = last = null;
}else {
kid.getLeft().setRight(kid.getRight()) ;
kid.getRight().setLeft(kid.getLeft());
if(kid == first){
first = kid.getRight();
}else if(kid == last){
last = kid.getLeft();
}
}
count--;
}
/**
* 返回链表的大小
* @author zkf
* @createTime 2013-7-16
* @return int
*/
public int getCount() {
return count;
}
/**
*返回链表第一个孩子
*@author zkf
*@createTime 2013-7-16
*@return Kid
*/
public Kid getLast() {
return last;
}
/**
*返回最后一个孩子
*@author zkf
*@createTime 2013-7-16
*@return Kid
*/
public Kid getFirst() {
return first;
}
}
3.客户端测试
代码:
/**
* 链表形式实现下面功能
* @description Test_11_Example.class
* @author zkf
* @createTime 2013-7-16
*/
public class Test {
public static void main(String[] args) {
//添加500元素
LinkList ll = new LinkList();
for (int i = 0; i < 500; i++) {
ll.add(new Kid(i));
}
//数到三 删除一个元素
int flag=1;
Kid kid = ll.getFirst();
while(ll.getCount() >1){
if(flag == 3){
ll.move(kid);
flag = 1;
}else {
flag++;
}
kid = kid.getRight();
}
System.out.println(ll.getFirst().getId());
}
}
4.结果:
435