LeetCode(24)Swap Nodes in Pairs

2420 ワード

タイトルは以下の通りです: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.
タイトル分析:入力要素の個数が偶数で、例えば1->2->3->4であれば、出力結果はちょうど2対で、2->1->4->3である.入力要素の個数が奇数で、例えば1->2->3->4->5であれば、出力結果はちょうど最後の要素が2対にならず、2->1->4->3->5である.
コードは以下の通りです:class Solution{public:ListNode*swapPairs(ListNode*head){if(head=NULL||head->next=NULL)             return head;         ListNode* p=head;         ListNode* q=head->next;         ListNode* x=head->next->next;         ListNode* t=NULL;         head=q;         while(p!=NULL&&q!=NULL){             q->next=p;             p->next=NULL;             if(t!=NULL)                 t->next=q;             t=p;                          p=x;             if(x!=NULL)                 q=x->next;             if(q!=NULL)                 x=q->next;         }         if(p!=NULL)             t->next=p;         return head;     } };
ListNode *swapPairs(ListNode *head) {
        if(head==NULL||head->next==NULL)
            return head;
        ListNode* p=head;
        ListNode* q=head->next;
        ListNode* x=head->next->next;
        ListNode* t=NULL;
        head=q;
        while(p!=NULL&&q!=NULL){
            q->next=p;
            p->next=NULL;
            if(t!=NULL)
                t->next=q;
            t=p;
            
            p=x;
            if(x!=NULL)
                q=x->next;
            if(q!=NULL)
                x=q->next;

        }
        if(p!=NULL)
            t->next=p;
        return head;
}

update:2014-10-17再帰
/**
 * 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) {
        if(head == NULL || head->next ==NULL)
            return head;
        ListNode* new_head = head->next;
        head->next = new_head->next;
        new_head->next = head;
        new_head->next->next = swapPairs(new_head->next->next);
        return new_head;
    }
};