單向鏈表反轉(zhuǎn)(轉(zhuǎn))

          轉(zhuǎn)自于http://www.cppblog.com/tx7do/archive/2009/01/06/71280.html

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


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

          這個題目算是考察數(shù)據(jù)結(jié)構(gòu)的最基礎(chǔ)的題目了,有兩種方法可以解此題:

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

              }

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


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


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

          posted on 2009-05-12 17:51 蔣耘 閱讀(3826) 評論(1)  編輯  收藏 所屬分類: 數(shù)據(jù)結(jié)構(gòu)與算法

          評論

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

          方法一中尾節(jié)點(翻轉(zhuǎn)前的頭結(jié)點)Next未置為NULL  回復(fù)  更多評論   


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


          網(wǎng)站導(dǎo)航:
           
          <2009年5月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 崇左市| 安化县| 仁布县| 广宁县| 日照市| 山东省| 常熟市| 天全县| 新乐市| 扎鲁特旗| 贞丰县| 城固县| 怀远县| 红原县| 米易县| 井研县| 文昌市| 宜章县| 上饶市| 威宁| 湖州市| 顺平县| 汉阴县| 临邑县| 万荣县| 浦县| 将乐县| 仲巴县| 呼伦贝尔市| 阳信县| 汉源县| 林西县| 青岛市| 元阳县| 阿拉善右旗| 汝南县| 台北市| 肇源县| 鹤岗市| 鸡东县| 正蓝旗|