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;    
    }
};

 

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