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



    每天早上叫醒你的不是闹钟,而是心中的梦~
  • 相关阅读:
    记一次网易前端实习面试
    你知道吗?Web的26项基本概念和技术
    CSS 颜色代码大全
    研究旧项目, 常用 sql 语句
    Asp.net core 学习笔记 QR code and Barcode
    Html to PDF
    Asp.net core 学习笔记 Node Service
    Asp.net core Identity + identity server + angular + odata + 权限管理
    Angular Material (Components Cdk) 学习笔记 Table
    es6 getter setter
  • 原文地址:https://www.cnblogs.com/vintion/p/4117001.html
Copyright © 2011-2022 走看看