• 【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

  • 相关阅读:
    LeetCode 217. 存在重复元素
    LeetCode 48. 旋转图像
    LeetCode 35. 搜索插入位置
    LeetCode 27. 移除元素
    LeetCode 145. 二叉树的后序遍历 (用栈实现后序遍历二叉树的非递归算法)
    LeetCode 328. 奇偶链表
    LeetCode 160. 相交链表 (找出两个链表的公共结点)
    LeetCode 26. 删除排序数组中的重复项
    LeetCode 836. 矩形重叠
    数据库
  • 原文地址:https://www.cnblogs.com/Atanisi/p/6838515.html
Copyright © 2020-2023  润新知