zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    关于vue中的语法糖v-model
    Cocos2d-x shader学习1: 灰度shader
    nginx多域名配置
    lua和c的亲密接触
    LeetCode 2. Add Two Numbers 解题报告
    LeetCode 1. Two Sum 解题报告
    【翻译】LPeg编程指南
    Cocos2d-x中的CC_CALLBACK_X详解
    C++ 11 学习3:显示虚函数重载(override)
    C++ 11 学习2:空指针(nullptr) 和 基于范围的for循环(Range-based for loops)
  • 原文地址:https://www.cnblogs.com/Atanisi/p/6838515.html
Copyright © 2011-2022 走看看