leetcode 49: Swap Nodes in Pairs


Feb 15 '12

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) {}
 * };
 */
 
 // NULL, {1}, {1,2}, {1,2,3}, {1,2,3,4}
class Solution {
public:
    ListNode *swapPairs(ListNode *head) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        
        //if(!head || !head->next) return head; no need. while condition have same effect.
        ListNode ** p = &head;
        
        ListNode * pre = NULL;
        ListNode * cur = head;
        ListNode * nxt = NULL;
        
        while(cur!=NULL && cur->next!=NULL) {
            for(int i=0; i<2; i++) {
                nxt = cur->next;
                cur->next = pre;
                pre = cur;   //do not forget renew pre.
                cur = nxt;
            }
            ListNode * t = *p;//(*p)->next;   //!!important,  when dereference **, it is already point to the next. 
            *p = pre;
            t->next = nxt;
            p = &(t->next);
            pre = NULL;                    //do not forget assign NULL to pre.
        }
        
        return head;
    }
};


 

posted @ 2013-01-23 16:03  西施豆腐渣  阅读(201)  评论(0编辑  收藏  举报