單向鏈表反轉(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)。
解答:
我們假設(shè)單向鏈表的節(jié)點如下:







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














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












采用此算法需要注意的是,頭結(jié)點必須要傳入的是引用,因為在遞歸跳出的時候要切斷鏈表,否則鏈表將會形成一個回環(huán)。
posted on 2009-05-12 17:51 蔣耘 閱讀(3826) 評論(1) 編輯 收藏 所屬分類: 數(shù)據(jù)結(jié)構(gòu)與算法