• Swap Nodes in Pairs


    Given a linked list, swap every two adjacent nodes and return its head.

    For example,
    Given 1->2->3->4, you should return the list as 2->1->4->3.

    Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.

    这里贴一个错误代码,本人的:

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode *swapPairs(ListNode *head) {
            // IMPORTANT: Please reset any member data you declared, as
            // the same Solution instance will be reused for each test case.
            if(head|| head->next)
                return head;
            ListNode *p, *q, *swap;
            p = head;
            q = p->next;
            swap = q;
            while(p&&q)
            {
                p->next = q->next;
                q->next = p;
                p       = p->next;
                q       = p->next;
            }
            return swap;
        }
    };

    Submission Result: Runtime Error

    Last executed input:{1,2}

    原因:

    q = p->next; //此时p=NULL了

    于是添加 if(p)于前

    又错误:

    Submission Result: Runtime Error

    Last executed input:{}

    还是那个原因

    if(head||head->next)

    head=NULL时, head->next就错了

    改之:

    if(!head||!head->next) return head;


    当一切就绪时,

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode *swapPairs(ListNode *head) {
            // IMPORTANT: Please reset any member data you declared, as
            // the same Solution instance will be reused for each test case.
            if(!head||!head->next)
                return head;
            ListNode *p, *q, *swap;
            p = head;
            q = p->next;
            swap = q;
            while(p&&q)
            {
                p->next = q->next;
                q->next = p;
                p       = p->next;
                if(!p)
                    break;
                else
                    q   = p->next;
            }
           return swap;
        }
    };

    Input:{1,2,3,4}Output:{2,1,3}Expected:{2,1,4,3}

    这个错误是, 到后面, 前断开的没连上


    增加前面的pre

    最终代码:

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode *swapPairs(ListNode *head) {
            // IMPORTANT: Please reset any member data you declared, as
            // the same Solution instance will be reused for each test case.
            if(!head||!head->next)
                return head;
            ListNode *p, *q, *swap, *pre;
            p = head;
            q = p->next;
            swap = q;
            pre  = NULL;
            while(p&&q)
            {
                p->next = q->next;
                q->next = p;
                if(pre)
                    pre->next = q;
                pre     = p;
                p       = p->next;
                if(!p)
                    break;
                else
                    q   = p->next;
            }
           return swap;
        }
    };



    每天早上叫醒你的不是闹钟,而是心中的梦~
  • 相关阅读:
    数论 欧几里德算法 以及 欧几里得拓展
    数论 快速幂的原理讲解
    汉诺塔模板
    C++ 迭代器运算
    C++ STL vector set map 简易用法
    C++ 使用指向函数的指针数组
    Codeforces 718C 线段树+矩乘
    BZOJ 2506 分块
    Codeforces 455D 分块+链表
    Codeforces 19E 树上差分
  • 原文地址:https://www.cnblogs.com/vintion/p/4117001.html
Copyright © 2020-2023  润新知