zoukankan      html  css  js  c++  java
  • LeetCode

    Swap Nodes in Pairs

    2013.12.7 01:54

    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.

    Solution:

      This kind of problem is designed just to make some trouble for you, and the interviewer must be very glad watching you getting into a bloody mess with the code. So let's first write down the process in language description:

        1. use two pointers $p1/$p2 pointing to the first/second node in each pair.

        2. change the $next pointers of p1 and p2

        3. swap $p1 and $p2, make sure $p1 is still before $p2.

        4. record current $p2 as the parent pointer $par, which will be used in the next pair.

        5. move both $p1 and $p2 forward by two steps, don't forget to check for nullptr.

        6. {do the swapping for the next pair}, and point $par->next to $p1

      Time complexiy is O(n), space complexity is O(1). The real problem is whether you can write the code nice and clean. Try to be careful and patient.

    Accepted code:

    // This problem is tricky, 3WA
    /**
     * 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.
            ListNode *p1 = nullptr, *p2 = nullptr;
            
            if(head == nullptr){
                return head;
            }
            
            p1 = head;
            p2 = head->next;
            if(p2 == nullptr){
                return p1;
            }
            
            bool first_swap = true;
            ListNode *tmp, *par;
            ListNode *root;
            
            par = new ListNode(0);
            root = par;
            par->next = p1;
            while(true){
                p1->next = p2->next;
                p2->next = p1;
                
                tmp = p1;
                p1 = p2;
                p2 = tmp;
                
                par->next = p1;
                par = p2;
                
                if(first_swap){
                    head = p1;
                    first_swap = false;
                }
                
                p1 = p1->next;
                p2 = p1->next;
                if(p2 == nullptr){
                    break;
                }
                
                p1 = p1->next;
                p2 = p1->next;
                if(p2 == nullptr){
                    break;
                }
            }
            
            delete root;
            root = nullptr;
            return head;
        }
    };
  • 相关阅读:
    ABP 开发(一)
    转发: Angular装饰器
    AJAX上传文件到服务器
    转:system.Security.Cryptography C# 加密和解密
    asp.net mvc5 step by step(四)——关于Controller的ActionResult
    asp.net mvc5 step by step(三)—— Entity Framework Database First
    asp.net mvc5 step by step(二)——Data Annotations(data 注释)
    项目中使用protobuf
    架构私用Nuget服务器
    dockerfile语法
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3462391.html
Copyright © 2011-2022 走看看