單向鏈表反轉(轉)

          轉自于http://www.cppblog.com/tx7do/archive/2009/01/06/71280.html

          題目:已知單向鏈表的頭結點head,寫一個函數把這個鏈表逆序 ( Intel)


          解答:
          我們假設單向鏈表的節點如下:
          template <typename T>
          class list_node
          {
          public:
          list_node 
          * next;
          T data;
          }
          ;

          這個題目算是考察數據結構的最基礎的題目了,有兩種方法可以解此題:

          方法一:
              void reverse(node*& head)
              
          {
                  
          if ( (head == 0|| (head->next == 0) ) return;// 邊界檢測
                  node* pNext = 0;
                  node
          * pPrev = head;// 保存鏈表頭節點
                  node* pCur = head->next;// 獲取當前節點
                  while (pCur != 0)
                  
          {
                      pNext 
          = pCur->next;// 將下一個節點保存下來
                      pCur->next = pPrev;// 將當前節點的下一節點置為前節點
                      pPrev = pCur;// 將當前節點保存為前一節點
                      pCur = pNext;// 將當前節點置為下一節點
                  }

              }

          這是一般的方法,總之就是用了幾個臨時變量,然后遍歷整個鏈表,將當前節點的下一節點置為前節點。


          方法二:
              node* reverse( node* pNode, node*& head)
              
          {
                  
          if ( (pNode == 0|| (pNode->next == 0) ) // 遞歸跳出條件
                  {
                      head 
          = pNode; // 將鏈表切斷,否則會形成回環
                      return pNode;
                  }


                  node
          * temp = reserve(pNode->next, head);// 遞歸
                  temp->next = pNode;// 將下一節點置為當前節點,既前置節點
                  return pNode;// 返回當前節點
              }
          這個方法是采用了遞歸算法,也就是在反轉當前節點之前先反轉其后繼節點,說白了其實就是利用函數的調用堆棧構建了一個臨時鏈表罷了,挺廢的一個算法,權當作是寫著好玩,沒有什么實在的意義。
          采用此算法需要注意的是,頭結點必須要傳入的是引用,因為在遞歸跳出的時候要切斷鏈表,否則鏈表將會形成一個回環。

          posted on 2009-05-12 17:51 蔣耘 閱讀(3829) 評論(1)  編輯  收藏 所屬分類: 數據結構與算法

          評論

          # re: 單向鏈表反轉(轉)[未登錄] 2013-08-29 00:39 fornever

          方法一中尾節點(翻轉前的頭結點)Next未置為NULL  回復  更多評論   


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


          網站導航:
           
          <2013年8月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          統計

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 德令哈市| 交城县| 塔河县| 沙雅县| 元朗区| 甘泉县| 奉节县| 夏津县| 曲靖市| 阿荣旗| 山东| 铜山县| 淄博市| 古蔺县| 张家口市| 航空| 隆子县| 筠连县| 莱阳市| 奉化市| 苏州市| 峨边| 余江县| 酉阳| 炎陵县| 嘉义县| 隆安县| 孙吴县| 抚宁县| 诏安县| 惠来县| 靖边县| 大余县| 宣恩县| 从江县| 长岭县| 丽水市| 长垣县| 盐津县| 宣威市| 潮安县|