您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“java基于雙向環形鏈表解決丟手帕問題的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“java基于雙向環形鏈表解決丟手帕問題的示例分析”這篇文章吧。
具體如下:
問題:設編號為1、2……n的幾個小孩圍坐一圈,約定編號為k(1=<k<=n)的小孩從1開始報數,數到m的那個出列,他的下一位又從1開始報數,數到m的那個人又出列,直到所有人出列為止,由此產生一個出隊編號的序列。
我們現在用一個雙向環形鏈表來解這一問題。先來看看下面這幅圖:
圓圈代表一個結點,紅色的指針指向下一個元素,紫色的指針指向上一個元素。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<length){ 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<k){ cursor=cursor.nextChild; } while(length>1){ //數m下 for(int i=1;i<m;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基于雙向環形鏈表解決丟手帕問題的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。