<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      javascript中使用循環(huán)鏈表實現(xiàn)約瑟夫環(huán)問題

      1.問題 

        傳說在公元1 世紀的猶太戰(zhàn)爭中,猶太歷史學家弗拉維奧·約瑟夫斯和他的40 個同胞被羅馬士兵包圍。猶太士兵決定寧可自殺也不做俘虜,于是商量出了一個自殺方案。他們圍成一個圈,從一個人開始,數(shù)到第三個人時將第三個人殺死,然后再數(shù),直到殺光所有人。約瑟夫和另外一個人決定不參加這個瘋狂的游戲,他們快速地計算出了兩個位置,站在那里得以幸存。寫一段程序?qū) 個人圍成一圈,并且第m個人會被殺掉,計算一圈人中哪兩個人最后會存活。使用循環(huán)鏈表解決該問題。

        看到這個問題首先想到的是要用到循環(huán)鏈表,還有就是要計算鏈表中有多少個元素,這兩點很重要。再有就是找到當前節(jié)點和在鏈表中向前移動m個節(jié)點。下面一一分析:循環(huán)鏈表很容易實現(xiàn),就是初始化的時候使鏈表的頭節(jié)點的下一個指向它自己,這樣初始化一個空節(jié)點,注意鏈表的頭不是節(jié)點。寫法如下:this.head.next = this.head;計算鏈表中有多少個元素也很簡單,只需要找到頭節(jié)點,然后往下走直到再次回到頭結(jié)點,代碼如下:

      var node = this.head;
      var i = 0;
      while (!(node.next.element == "head")){
          node = node.next;
          i++;
      }
      return i;

      在初始化鏈表的時候我們定義一個當前節(jié)點,將它賦值為頭節(jié)點this.currentNode = this.head;,這樣在移動節(jié)點的時候就可以用它指向下一個節(jié)點。向前移動節(jié)點的時候有個地方需要注意,如果當前移動到頭節(jié)點上需要再向前移動一個節(jié)點this.currentNode.next.next。代碼如下:

      while (n>0){
          if(this.currentNode.next.element == "head"){
              this.currentNode = this.currentNode.next.next;
          }else{
              this.currentNode = this.currentNode.next;
          }
          n--;
      }

      2.代碼實現(xiàn)

      /**
       * 使用循環(huán)鏈表實現(xiàn)解決約瑟夫環(huán)問題
       * */
      
      //鏈表節(jié)點
      function Node(element){
          this.element = element;
          this.next = null;
      }
      
      //定義鏈表類
      function LList(){
          this.head = new Node("head");
          this.head.next = this.head;
          this.find = find;
          this.insert = insert;
          this.findPrevious = findPrevious;
          this.remove = remove;
          this.currentNode = this.head;
          //從鏈表當前節(jié)點向前移動n個節(jié)點
          this.advance = advance;    
          //當前鏈表中有多少個元素
          this.count = count;
          this.display = display;
      }
      
      //查找節(jié)點
      function find(item){
          var currNode = this.head;
          while (currNode.element != item){
              currNode = currNode.next;
          }
          return currNode;
      }
      
      //插入新節(jié)點
      function insert(newElement, item){
              var newNode = new Node(newElement);
              var current = this.find(item);
              newNode.next = current.next;
              current.next = newNode;
      }
      
      //查找當前節(jié)點的上一個節(jié)點
      function findPrevious(item){
          var currNode = this.head;
          while (!(currNode.next == null) && (currNode.next.element != item)){
              currNode = currNode.next;
          }
          return currNode;
      }
      
      //移除當前節(jié)點
      function remove(item){
          var prevNode = this.findPrevious(item);
          if(!(prevNode.next == null)){
              prevNode.next = prevNode.next.next;
          }
      }
      
      //向前移動n個節(jié)點
      function advance(n){
          while (n>0){
              if(this.currentNode.next.element == "head"){
                  this.currentNode = this.currentNode.next.next;
              }else{
                  this.currentNode = this.currentNode.next;
              }        
              n--;
          }
      }
      
      //當前鏈表中有多少個元素
      function count(){
          var node = this.head;
          var i = 0;
          while (!(node.next.element == "head")){
              node = node.next;
              i++;
          }
          return i;
      }
      
      //輸出所有節(jié)點
      function display(){
          var currNode = this.head;
          while (!(currNode.next == null) && !(currNode.next.element == "head")){
              document.write(currNode.next.element +  "&nbsp;");
              currNode = currNode.next;
          }
      }
      
      var person = new LList();
      person.insert('1','head');
      person.insert('2', '1');
      person.insert('3', '2');
      person.insert('4' , '3');
      person.insert('5' , '4');
      person.insert('6' , '5');
      person.insert('7' , '6');
      person.insert('8' , '7');
      person.insert('9' , '8');
      person.insert('10' , '9');
      
      
      person.display();
      document.write('<br>');
      
      
      var n = 3;
      while (person.count() > 2){
          person.advance(n);
          person.remove(person.currentNode.element);
          person.display();
          document.write('<br>');
      }

       這里我們假設有10個人,每次數(shù)到第三個人的時候這個人自殺,最后輸出的結(jié)果如下:

       最后結(jié)果是約瑟夫和他的同伴一個站在隊伍的第4個,一個站在隊伍的第10個,最后只剩下他們兩個人。不知道歷史上有沒有這件事,如果真的有這件事,在這么短的時間內(nèi)解決這個問題,約瑟夫真他么是個天才,不知道當時他有沒有用指針來解決這個問題,還是用普通的數(shù)組遞歸解決。

      posted @ 2016-10-22 00:56  nd  閱讀(2671)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲AVAV天堂AV在线网阿V| 亚洲综合色婷婷中文字幕| 国产精品三级黄色小视频| 亚洲欧美人成电影在线观看| 国精品无码人妻一区二区三区| 男人扒开添女人下部免费视频| 久久精品久久黄色片看看| 野花韩国高清电影| 成人免费无遮挡无码黄漫视频| 在线日韩日本国产亚洲| 99国产精品欧美一区二区三区| 深夜福利啪啪片| 无码熟妇人妻AV影音先锋| 永胜县| 里番全彩爆乳女教师| 亚洲av鲁丝一区二区三区黄| 成人福利一区二区视频在线| 伊人精品成人久久综合97| 日韩区中文字幕在线观看| 欧美在线精品一区二区三区| 亚洲偷自拍国综合| 国产免费网站看v片元遮挡| 欧美不卡无线在线一二三区观| 天天躁日日躁狠狠躁av麻豆男男| 亚洲精品成人片在线观看精品字幕| 国产在线中文字幕精品| 故城县| 天堂网亚洲综合在线| 亚洲伊人久久综合影院| 康平县| av天堂久久天堂av| 成人av一区二区三区| 特黄 做受又硬又粗又大视频| 亚洲欧洲av一区二区| 国产AV影片麻豆精品传媒| 中文字幕无码乱码人妻系列蜜桃 | 国产美女精品一区二区三区| 久久热精品视频在线视频| 一本无码在线观看| 国产亚洲无线码一区二区| 一区二区三区四区黄色网|