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;
}
};