丢手帕java_java基于双向环形链表解决丢手帕问题的方法示例
本文實例講述了java基于雙向環形鏈表解決丟手帕問題的方法。分享給大家供大家參考,具體如下:
問題:設編號為1、2……n的幾個小孩圍坐一圈,約定編號為k(1=
我們現在用一個雙向環形鏈表來解這一問題。先來看看下面這幅圖:
圓圈代表一個結點,紅色的指針指向下一個元素,紫色的指針指向上一個元素。first指針指向第一個元素,表明第一個元素的位置,cursor是游標指針,它的作用重大。那么這個環形的鏈表就可以模擬小孩排成的圓圈,下面是具體的代碼:
public class Test {
public static void main(String[] args){
CycleLink cl=new CycleLink(5); //構造環形鏈表
System.out.println("腳本之家測試結果:");
cl.print();
cl.setK(2); //設置從第幾個小孩開始數數
cl.setM(3); //設置數幾下
cl.play(); //開始游戲
}
}
class Child{
int no;
Child nextChild;
Child previousChild;
public Child(int no){
this.no=no;
}
}
class CycleLink{
Child first;
Child cursor;
int length;
//從第幾個小孩開始數
private int k=1;
//數幾下
private int m=1;
//構造函數
public CycleLink(int len){
this.length=len;
for(int i=1;i<=length;i++){
Child ch=new Child(i);
if(i==1){
first=ch;
cursor=ch;
}else if(i
cursor.nextChild=ch;
ch.previousChild=cursor;
cursor=ch;
}else {
cursor.nextChild=ch;
ch.previousChild=cursor;
cursor=ch;
ch.nextChild=first;
first.previousChild=ch;
}
}
}
//打印鏈表
public void print(){
cursor=first;
do{
System.out.print(cursor.no+"<
cursor=cursor.nextChild;
}while(cursor!=first);
System.out.println();
}
//開始游戲
public void play(){
Child temp;
cursor=first;
//先找到第k個小孩
while(cursor.no
cursor=cursor.nextChild;
}
while(length>1){
//數m下
for(int i=1;i
cursor=cursor.nextChild;
}
System.out.println("小孩"+cursor.no+"出局了!");
//找到前一個小孩
temp=cursor.previousChild;
// temp=cursor;
// do{
// temp=temp.nextChild;
// }while(temp.nextChild!=cursor);
temp.nextChild=cursor.nextChild;
cursor.nextChild.previousChild=temp;
cursor=cursor.nextChild;
length--;
}
System.out.println("最后一個出局的小孩是"+cursor.no);
}
public void setK(int k) {
this.k = k;
}
public void setM(int m) {
this.m = m;
}
}
這個代碼的基本框架是根據韓順平的視頻的。不過他用的是一個單向的鏈表,上面的代碼注釋的部分是用來找cursor所指向的元素的上一個元素的,是將整個鏈表轉了一圈來實現的。這里我改成了雙向鏈表,直接用一個cursor.previousChild就可以了。
運行結果:
希望本文所述對大家java程序設計有所幫助。
總結
以上是生活随笔為你收集整理的丢手帕java_java基于双向环形链表解决丢手帕问题的方法示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原则的作者是谁啊?
- 下一篇: 求一个关于鹿晗的微信网名