首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

双向回环链表的实现.解决方法

2012-01-16 
双向回环链表的实现.声明一下,这个是看马士兵老师的java视频教程的时候看到的例子,感觉有趣就拿出来大家做

双向回环链表的实现.
声明一下,这个是看马士兵老师的java视频教程的时候看到的例子,感觉有趣就拿出来大家做做,思路很明确的给了出来,就是让大家实现一下整个类,另外构造一个测试的类给搞出来就over了.

鸡肋型问题.高手不惜的做,因为我就肯花十分.我们新手确实有难度,就是大家锻炼下.

小孩玩游戏,手拉手围成一个圈,然后数数.每次数到3的时候这个小孩退出,下一个从1开始再数.
试问,如果有500个小孩,最后剩下的小孩是原来的第多少个小孩.
要求:面向对象程序设计实现.

简析:
两个类:小孩,圈.
class Kid {
  int id;
  Kid left;
  Kid right;
}

class KidCircle {
  int count;
  Kid first,last;

  KidCircle(int n) {
  count = n;
  }

  void add() {}
  void delete() {}
}



[解决办法]
确切的名字叫做 : 约瑟夫环问题
典型的做法是模拟一个环形数组,即arr[i%N]
另一个做法只需要一个数学公式,一句话就可以得出答案,非常精炼。

确实有兴趣可以讨论下。
[解决办法]
看下人家的解决办法
public class Josephus {

public static void main(String[] args) {
if(args.length<2){
System.out.println("Input N and M.");
return;
}
int n = Integer.parseInt(args[0]);
int m = Integer.parseInt(args[1]);
int point=0,number=1;
List<Integer> list = new ArrayList<Integer>();
for(int i=1;i<=n; i++){
//初始化链表
list.add(i);
}

while(list.size()>1){
if(number%m==0){
list.remove(point);
--point;
}
++point;//指针后移
++number;
if(point>list.size()-1){
//指针越界重新开始
point=0;
}
}


System.out.println(list.get(0));

}
}
[解决办法]

Java code
public class Kie {    int id;    Kie left;    Kie right;    public Kie()    {            }    public Kie(int id)    {        this.id=id;    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public Kie getLeft() {        return left;    }    public void setLeft(Kie left) {        this.left = left;    }    public Kie getRight() {        return right;    }    public void setRight(Kie right) {        this.right = right;    }    public static void main(String []args)    {        Kie head=null;        Kie last=null;        Kie newF = null;        for(int i=1;i<8;i++)        {            newF = new Kie(i);            if(head==null)            {                head=newF;                last = head;            }else            {                last.right=newF;                last = newF;            }        }        head.left=last;        last.right=head;//        Kie k =head;//        while(k.right!=head)//        {//            System.out.println(k.id);//            k = k.right;//        }//                Kie node = head;        while(node.left!=node.right||node.left==node.right&&node.left!=node)        {            node.right.right=node.right.right.right;            node.right.right.left=node.right;            node=node.right.right;            //System.out.println(node.id);        }        System.out.println(node.id);    }}
[解决办法]
你还真拿对象造个环哦......

下面是我做的。
package KidsGame;

import java.util.ArrayList;

public class Kids {
 int nowNumber=0;
public int GetNumber(){

return nowNumber++;

}
public void CallBack(){
nowNumber=1;
}
}
----------------------------------分割线---------------------------------

package KidsGame;

import java.util.ArrayList;



public class Ring {
ArrayList ring;
int thisPoint = 0;

Ring(ArrayList ring) {
this.ring = ring;
}

public void ringRun(Kids kid) {

if (thisPoint > ring.size() - 1) {
thisPoint = 1;
}

if (kid.GetNumber() == 3) {
kid.CallBack();
ringDwindle();
}else {
thisPoint++;
}

//System.out.println("下标指向"+thisPoint);

}

private void ringDwindle() {
//System.out.println("正在移出"+ring.get(thisPoint));
ring.remove(thisPoint);

}

public static void main(String[] args) {
Kids kid = new Kids();
for (int i = 0; i < 10; i++) {
if (kid.GetNumber() == 3) {
kid.CallBack();

}
}
}
}
----------------------------------分割线---------------------------------
package KidsGame;

import java.util.ArrayList;

public class Test {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
int ringSize=8;
for(int i=0;i<ringSize+1;i++){
list.add("我是第"+i+"号");

}

Ring ring=new Ring(list);
Kids kid=new Kids();

while (ring.ring.size()>2)
{
ring.ringRun(kid);

}
System.out.println("最后"+ring.ring.get(1));


}
}

热点排行