posts - 241,  comments - 116,  trackbacks - 0
             最近開始學習java的數據結構(確切地說,是用java實現的數據結構),首先,很大的感觸是,和C實現鏈表的思想是相通的啊。數據結構本來就一樣嘛。
            
             閑話少扯,直奔主題!
             先說鏈表吧,鏈表不同于以前我們學過的隊列或數組,它是非線性的,即不是在內存中連續存儲的。鏈表可以理解成由很多結點組成,很多人會把鏈表比喻為自行車 的鏈條,竊以為,這樣比喻是欠妥的,因為鏈條是連續的(哈哈哈哈,這個牛角尖鉆的),或許可以將其理解為你手機里存的親友手機號碼,我們可以通過這個號碼 和那個人取得聯系。我們一般將鏈表的一個結點分成兩個部分:Data filed和Pointer field(這些是作者沿用C里的叫法),數據域用來存儲數據,后面的指針域用來存放下一個結點的地址。
             結點的定義如下:
          public class Node {
          商賬追收

          // local declaration
          private Object obj;
          private Node next;

          // getters and setters
          public Object getObj() {
          return obj;
          }
          public void setObj(Object obj) {
          this.obj = obj;
          }
          public Node getNext() {
          return next;
          }
          public void setNext(Node next) {
          this.next = next;
          }

          } // end class Node
             這段代碼很清晰的表明了結點的組成內容。

             我的隊列之鏈表實現版實現了以下幾個功能:創建、增加、刪除、插入、修改、打印、取指定位置的值以及取隊列的大小。
             先選取其中的幾個闡述一下,希望大家指正!
            1.刪除:先上代碼
          // delete an item from list
          public void del(int index){

               // counters
          淘寶女裝夏裝新款

               int count = 0;

               // delete item
               if(index < 0 || index >= size()){
                  throw new RuntimeException("Out of index:" + index);
               }else{
                   if(index == 0){
              root = null;
          }else{
              Node node = root.getNext();
              while(node != null){
          count ++;
          if(index == count){
              node.setNext(node.getNext().getNext());
          }
          node = node.getNext();
              } // end loop while
                    } // end if-else
                } // end if-else

          } // end method del
             刪除的實現的一個難點是如何確認到達指定的index位置進行下一步操作。這里是首先定義了一個計數器,用以判斷是否到達指定位置,當 index==count時,就可以進行刪除操作了,刪除就是將index-1處得結點的next指向index+1處的結點,java的一個優點是,你 不用像C一樣人為地用free()函數釋放空間,JVM會自動回收。個人強烈建議,在學數據結構時,拿支筆在紙上畫畫,這樣可以將抽象的東西具體化,有利 于理解。向鏈表中增加一個元素就是刪除的逆過程了。此處不再贅述。

             2.插入:代碼如下
          // insert an item to list (follow item NO.index)
          public void insert(int index, Object obj){

          // counters
          int count = 0;

          if(index < 0 || index >= size()){
               throw new RuntimeException("Out of index: " + index);
          }else{
               // insert
               if(index == 0){
                  root.setObj(obj);
               }else{
                  // create a new node
                  Node insert = new Node();
                  insert.setObj(obj);

                  // insert it into the list
                  Node node = root.getNext();
                  while(node != null){
                       count ++;
                       if(index == count){
                          insert.setNext(node.getNext());
                          node.setNext(insert);
                       }
                       node = node.getNext();
                  } // end loop while
               } // end if-else

          } // end if-else

          } // end method insert
             這段代碼其實和刪除的很像,只是在判斷之間先創建一個insert結點并setObj了,而且,有一個很值得注意的地方是:必須先insert.setNext(node.getNext());否則就會出錯,大道理上是和程序時自上而下執行是有關的。相信你懂的。
             這兩段代碼都得先比較index和size()進行比較,這是為了保持代碼的健壯性。防止溢出。

             寫這個的時候,我就在想,我寫的東西很大一種程度上是給未來的自己看的,可以用作復習,可以用來找回憶,所以,總希望以一種輕松和諧的姿態行文。

             既然寫了這么多,就繼續扯點其他的吧,最近才發現,隨著時間的推移,最初那種經常將C和Java攪在一起的局面已經一去不復返了,現在開始學著用Java 解決一些以前用C解決的問題,通過這個過程,開始更加了解C和Java,二者的相似點和不同的地方也已經有點眉目了。欣慰啊,最開始同時學習的時候,總是 有點擔心,但是后來轉念一想:C和Java都是計算機語言,沒有必要將其完全分開,這才堅持了下來。過程雖然有點痛苦,但是結果還是有點滿意。
             現在這個階段,發現自己的C和java還是屬于大菜階段,但是,我一直固執地以為,只要我堅持了,就沒有辦不到的事,至少過去20年的經驗這樣告訴我的。編程的天才都是訓練出來的!我是一個不相信天才的人(盡管曾經有人這樣叫過我 )。

             最后,以我桌面上的一句話結束這次對話吧:The minute you think of giving up, think of the reason why you held on so long.
          posted on 2011-05-26 11:53 墻頭草 閱讀(226) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          人人游戲網 軟件開發網 貨運專家
          主站蜘蛛池模板: 东海县| 南京市| 文昌市| 浪卡子县| 大连市| 沙坪坝区| 五台县| 修文县| 屯门区| 武隆县| 永川市| 永春县| 兴化市| 扎囊县| 安阳市| 容城县| 五家渠市| 沅江市| 湘乡市| 桐乡市| 滦平县| 云龙县| 同江市| 长武县| 密山市| 阳山县| 商都县| 漯河市| 屏东县| 二手房| 阜新| 奎屯市| 大洼县| 明光市| 盐亭县| 大渡口区| 建始县| 湖南省| 合肥市| 鄂尔多斯市| 安福县|