【LeetCode】24. Swap Nodes in Pairs (3 solutions)

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) {
        if(head == NULL || head->next == NULL)
            return head;
        ListNode* newhead = head->next;
        head->next = swapPairs(newhead->next);
        newhead->next = head;
        return newhead;
    }
};

 

解法二:Reverse Nodes in k-Group令k=2

/**
 * 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) {
        return reverseKGroup(head,2);
    }
    ListNode *reverseKGroup(ListNode *head, int k) {
        ListNode* newhead = new ListNode(-1);
        ListNode* tail = newhead;
        ListNode* begin = head;
        ListNode* end = begin;
        while(true)
        {
            int count = k;
            while(count && end != NULL)
            {
                end = end->next;
                count --;
            }
            if(count == 0)
            {//reverse from [begin, end)
                stack<ListNode*> s;
                while(begin != end)
                {
                    s.push(begin);
                    begin = begin->next;
                }
                while(!s.empty())
                {
                    ListNode* top = s.top();
                    s.pop();
                    tail->next = top;
                    tail = tail->next;
                }
            }
            else
            {//leave out
                tail->next = begin;
                break;
            }
        }
        return newhead->next;
    }
};

 

解法三:

每两个节点成对交换次序后,返回给前一个结点进行连接。

/**
 * 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) {
        ListNode* newhead = new ListNode(-1);
        newhead->next = head;
        ListNode* tail = newhead;
        while(tail->next != NULL && tail->next->next != NULL)
        {
            ListNode* A = tail->next;
            ListNode* B = A->next;
            
            //swap
            A->next = B->next;
            B->next = A;
            tail->next = B;
            
            tail = tail->next->next;
        }
        return newhead->next;
    }
};

posted @ 2014-12-19 16:10  陆草纯  阅读(298)  评论(0编辑  收藏  举报