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

  • 相关阅读:
    centos7下安装jdk
    在centos7关于防火墙的基本操作
    hadoop的特性
    java中怎么使用combobox,并获取其选中的值
    @suppressWarnings("unchecked")在java中的作用
    The processing instruction target matching "[xX][mM][lL]" is not allowed.
    Invalid byte 2 of 2-byte UTF-8 sequence解决方案
    Nmap
    XSS-笔记
    sql盲注-笔记
  • 原文地址:https://www.cnblogs.com/Atanisi/p/6838515.html
Copyright © 2011-2022 走看看