91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java基于雙向環形鏈表解決丟手帕問題的示例分析

發布時間:2021-07-28 13:51:39 來源:億速云 閱讀:154 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“java基于雙向環形鏈表解決丟手帕問題的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“java基于雙向環形鏈表解決丟手帕問題的示例分析”這篇文章吧。

具體如下:

問題:設編號為1、2……n的幾個小孩圍坐一圈,約定編號為k(1=<k<=n)的小孩從1開始報數,數到m的那個出列,他的下一位又從1開始報數,數到m的那個人又出列,直到所有人出列為止,由此產生一個出隊編號的序列。

我們現在用一個雙向環形鏈表來解這一問題。先來看看下面這幅圖:

java基于雙向環形鏈表解決丟手帕問題的示例分析

圓圈代表一個結點,紅色的指針指向下一個元素,紫色的指針指向上一個元素。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基于雙向環形鏈表解決丟手帕問題的示例分析

以上是“java基于雙向環形鏈表解決丟手帕問題的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

如皋市| 沧州市| 嘉义县| 疏附县| 新巴尔虎左旗| 天峨县| 禄丰县| 鸡西市| 郎溪县| 定兴县| 嘉荫县| 察雅县| 民权县| 英超| 盐源县| 乾安县| 平顶山市| 深水埗区| 鸡泽县| 囊谦县| 临西县| 汶上县| 永平县| 邢台市| 乡宁县| 赤峰市| 明星| 达拉特旗| 磴口县| 天祝| 垦利县| 北流市| 宣威市| 白银市| 白城市| 望奎县| 榆树市| 武清区| 康马县| 延吉市| 临西县|