LeetCode - 反轉鏈表

題目描述

反轉一個單鏈表。

示例:

輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL

進階:
你可以迭代或遞歸地反轉鏈表。你能否用兩種方法解決這道題?

迭代方法一

這種反轉的題目使用迭代的方法我首先想到的是棧,用棧來保存每個節點的值,然後一個個彈出並將棧頂元素賦給另外一個鏈表,這個新的鏈表就是反轉後的鏈表。代碼如下:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        stack<int> s;
        ListNode* pList = head;
        ListNode* pNode = head;
        ListNode* reverseHead = pNode;
        int n;
        while(pList != NULL){
            s.push(pList->val);
            pList = pList->next;
        }
        while(pNode != NULL){
            n = s.top();
            s.pop();
            pNode->val = n;
           pNode = pNode->next;
        }
        return reverseHead;
    }
};

迭代方法二

第二種迭代的方法我們從節點的指針入手,通過改變每個節點指針的方向也就實現了鏈表的反轉。代碼如下:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode *root=head; 
        ListNode *pre=NULL;  
        ListNode *next=NULL;
        if(head==NULL) return NULL; 
        while(root->next){  
            next=root->next;   
            root->next=pre;      
            pre=root;       
            root=next;     
        }    
        root->next=pre; 
        return root; 
    }
};

遞歸方法

對應迭代方法二,可以使用相應的遞歸的方法來改變每個節點的指針。

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
    if (head == NULL || head->next == NULL)      
        return head;
    ListNode* newHead = reverseList(head->next); 
    head->next->next = head;                       
    head->next = NULL;                          
    return newHead;    
    }
};

 

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