Swap Nodes in Pairs 题解

题目来源: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.

解题思路:

reverseKGroup

前面刚写了 reverse-nodes-in-k-group,直接调用一下,传参数2即可。

//reverse [start, tail], return newhead
ListNode* reverse(ListNode* head, ListNode* tail)
{
    ListNode * pre = NULL;
    while(head != tail)
    {
        auto next = head->next;
        head->next = pre;
        pre = head;
        head = next;
    }
    head->next = pre; //do not forget tail
    return tail;
}
ListNode *reverseKGroup(ListNode *head, int k) 
{
    if(k <= 1 || head == NULL) return head;    
    ListNode * lastStart = NULL;
    ListNode * result = NULL;
    while(head)
    {
        int i = 1; 
        auto start = head;
        while(i++ < k && head != NULL)
            head = head->next;
        if(head != NULL)
        {
            auto end = head;
            auto nextbak = head->next;
            auto segStart = reverse(start, end);
            if (lastStart == NULL)  
                result = segStart;
            else 
                lastStart->next = segStart;
            lastStart = start;
            head = nextbak;
        }else//last segment
        {
            if(lastStart)
                lastStart->next = start;
            else //node len less than k
                return start;
        }
    }
    return result;
}
ListNode *swapPairs(ListNode *head) 
{
    return reverseKGroup(head, 2);
}

递归版本

> next(p1->p2->p3->p4...) = p1->next = next(p3->p4...); p2->next = p1; return p2;

代码如下:

ListNode* next(ListNode*p1, ListNode* p2)
{
    if (p1 == NULL) return NULL;
    if (p1 != NULL && p2 == NULL) return p1;
    p1->next = next(p2->next, p2->next ? p2->next->next : NULL);
    p2->next = p1;
    return p2;
}
ListNode *swapPairs(ListNode *head) 
{
    if(head == NULL || head->next == NULL) return head;
    return next(head, head->next);
}

迭代版本

ListNode *swapPairs(ListNode *head) 
{
    if(head == NULL || head->next == NULL) return head;
    //1     2   3       4 5
    //1st   2nd next
    ListNode dummy(-1);
    ListNode *pre = &dummy;
    ListNode *first = head, *second = NULL, *next = NULL;
    while(first && first->next)
    {
        second = first->next;
        next = second->next;

        pre->next = second;
        second->next = first;
        first->next = next;

        pre = first;
        first = next;
    }
    return dummy.next;
}

Last updated

Was this helpful?