struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
//when finished the code, find come cases to test it first
public:
ListNode *swapPairs(ListNode *head) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
ListNode* prev = NULL;
ListNode* first = NULL;
ListNode* second = head;
int k = 1;
while (second != NULL)
{
if (k%2 == 0)
{
first->next = second->next;
second->next = first;
if(prev != NULL)//when process prev pointer, we should be very careful
prev->next = second;
else head = second;
ListNode* tmp = first;
first = second;
second = tmp;
}
prev = first;
first = second;
second = second->next;
k++;
}
return head;
}
};
second time
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reverseList(ListNode* head, int k, ListNode*& reverseHead, ListNode*& reverseTail, ListNode*& nextHead)
{
reverseTail = head;
ListNode* prev = head;
ListNode* cur = head->next;
for(int i = 0; i < k-1; ++i)
{
if(cur == NULL) break;
ListNode* tmp = cur->next;
cur->next = prev;
prev = cur;
cur = tmp;
}
reverseHead = prev;
nextHead = cur;
}
ListNode *swapPairs(ListNode *head) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
ListNode dummy(-1);
ListNode* prev = &dummy;
ListNode* nextHead = head;
while(nextHead != NULL)
{
ListNode* reverseHead;
ListNode* reverseTail;
reverseList(nextHead, 2, reverseHead, reverseTail, nextHead);
prev->next = reverseHead;
prev = reverseTail;
}
prev->next = NULL;
return dummy.next;
}
};