【Lintcode】 035.Reverse Linked List

题目:

Reverse a linked list.

Example

For linked list 1->2->3, the reversed linked list is 3->2->1

题解:

Solution 1 ()

class Solution {
public:
    ListNode *reverse(ListNode *head) {
        if (!head) {
            return head;
        }
        ListNode *prev = nullptr;
        while (head) {
            ListNode *tmp = head->next;
            head->next = prev;
            prev = head;
            head = tmp;
        }
        
        return prev;
    }
};

  The basic idea of this recursive solution is to reverse all the following nodes after head. Then we need to set head to be the final node in the reversed list. We simply set its next node in the original list (head -> next) to point to it and sets its next to be NULL.

Solution 2 ()

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

 

疑问?为啥下面这段程序是错的

class Solution {
public:
    ListNode *reverse(ListNode *head) {
        if (!head) {
            return head;
        }
        ListNode *prev = nullptr;
        while (head) {
            ListNode *tmp = head;
            head->next = prev;
            prev = head;
            head = tmp->next;

        }
        
        return prev;
    }
};

  若一定要tmp保存head,那么程序应该如下

class Solution {
public:
    ListNode *reverse(ListNode *head) {
        if (!head) {
            return head;
        }
        ListNode *prev = nullptr;
        while (head) {
            ListNode *tmp = new ListNode(-1);
            *tmp = *head;
            head->next = prev;
            prev = head;
            head = tmp->next;
            delete tmp;
        }
        
        return prev;
    }
};

 

解惑:

int main()
{
    ListNode* tmp = new ListNode(0);
    ListNode* p = new ListNode(1);
    ListNode* q = new ListNode(2);
    ListNode* r = new ListNode(3);
    ListNode** t = &tmp;
    tmp->next = p;
    p->next = q;
    q->next = r;
    
    t = &((*t)->next);
    (*t) = (*t)->next;

    cout << (*t)->val << endl;
    cout << tmp->next->val << endl;
    cout << (*p).val << endl;
    
    return 0;
}

输出为:2 2 1

posted @ 2017-05-10 22:30  Vincent丶丶  阅读(184)  评论(0编辑  收藏  举报