1. 程式人生 > >單向連結串列反轉

單向連結串列反轉

轉自於: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;// 返回當前節點
    }
這個方法是採用了遞迴演算法,也就是在反轉當前節點之前先反轉其後繼節點,說白了其實就是利用函式的呼叫堆疊構建了一個臨時連結串列罷了,挺廢的一個演算法,權當作是寫著好玩,沒有什麼實在的意義。
採用此演算法需要注意的是,頭結點必須要傳入的是引用,因為在遞迴跳出的時候要切斷連結串列,否則連結串列將會形成一個迴環