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

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

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


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

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

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

              }

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


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


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

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

          評(píng)論

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

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


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


          網(wǎng)站導(dǎo)航:
           
          <2013年8月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 吉林市| 南丰县| 南宫市| 祁连县| 自治县| 兴宁市| 句容市| 个旧市| 沭阳县| 田林县| 绵竹市| 惠来县| 阿城市| 泗洪县| 大安市| 南京市| 曲阳县| 伊宁市| 灌阳县| 津市市| 辽中县| 天津市| 内黄县| 泊头市| 株洲县| 延边| 沙坪坝区| 舟山市| 九寨沟县| 安新县| 五河县| 兴安县| 镇远县| 铜陵市| 郓城县| 高青县| 岳西县| 上栗县| 丹阳市| 大宁县| 石林|