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

  • 相关阅读:
    nmap 查看内网存活主机
    msf ms17_010 port:445
    nmap 检测ms17-010 port:445
    msf mysql port:3306
    msf ssh port:22
    Wireshark的两种过滤器与BPF过滤规则
    Wireshark使用记录
    过滤搜索引擎的抓取数据
    WEB容器开启、关闭OPTIONS方法
    代码泄露到Github
  • 原文地址:https://www.cnblogs.com/Atanisi/p/6838515.html
Copyright © 2011-2022 走看看