LintCode "Swap Two Nodes in Linked List"

Nothing special. Just take care of corner cases.

class Solution {
public:
    /**
     * @param head a ListNode
     * @oaram v1 an integer
     * @param v2 an integer
     * @return a new head of singly-linked list
     */
    ListNode* swapNodes(ListNode* head, int v1, int v2)
    {
        if(!head) return head;
        
        ListNode *p1 = nullptr, *p1p = nullptr, *p1n = nullptr;
        ListNode *p2 = nullptr, *p2p = nullptr, *p2n = nullptr;

        //  Pass 1: Find nodes
        //
        ListNode *prev = nullptr, *p = head, *next = p->next;
        while(p)
        {
            if(p->val == v1 || p->val == v2)
            {
                if(!p1)
                {
                    p1 = p;
                    p1p = prev;
                    p1n = next;
                }
                else
                {
                    p2 = p;
                    p2p = prev;
                    p2n = next;
                }
            }
            // move on
            prev = p;
            p = next;
            next = next?next->next:nullptr;
        }// while

        if(!p1 || !p2)
            return head;
            
        //  Step 2:
        //
        ListNode *ret = head;
        if(p1 == head)
        {
            ret = p2;
        }

        if (p1n == p2) // adjacent
        {
            if(p1p)
                p1p->next = p2;
            p2->next = p1;
            p1->next = p2n;
        }
        else
        {
            if(p1p)
                p1p->next = p2;
            p2->next = p1n;
            p2p->next = p1;
            p1->next = p2n;
        }

        return ret;
    }
};
View Code
原文地址:https://www.cnblogs.com/tonix/p/5344692.html