單鏈表反轉的三種方法

Talk is cheap, show your code!


struct Node
{
    int data;
    Node* m_pNext;
    Node(int d):data(d){m_pNext = NULL;}
};

1. 從前遍歷到尾,依次反轉指針的指向,原來的頭指針的下一結點設置爲空,原來的尾結點變成頭結點返回。

Node* Reverse(Node*& head)
{
    if(head ==  NULL)
    {
        return head;
    }

    Node* pre = NULL;
    Node* cur = head;
    Node* nex;

    while(cur)
    {
        nex = cur->m_pNext;
        cur->m_pNext = pre;
        pre = cur;
        cur = nex;
    }


    return head = pre;
}


2. 設置一個新的空鏈表,然後每次從原來的鏈表中取出最前面的元素,插入到這個新的鏈表之中,直到最後一個元素。

Node* Reverse2(Node*& head)
{
    if (head == NULL) return head;

    Node* pList = NULL; // 新的空鏈表。
    Node* cur = head;

    while(cur)
    {
        Node* Tmp = cur->m_pNext;
        cur->m_pNext = pList;
        pList = cur;
        cur = Tmp;
    }
    return head = pList;
}


3. 採用遞歸。

Node* Reverse3(Node* head)
{
    if (head == NULL || head->m_pNext == NULL)
        return head;

    Node* p = Reverse3(head->m_pNext);
    head->m_pNext->m_pNext = head;
    head->m_pNext = NULL;

    return p;
}

這種遞歸的方式,需要注意的是,執行完後head不再有用。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章