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.
class Solution {
public:
ListNode* reverse ( ListNode* head, int k ) {
if ( head == NULL || head->next == NULL ) {
return head;
}
ListNode* p = head, *q = head->next, *r = NULL;
int count = k;
while ( q && count-- > 1){
r = q->next;
q->next = p;
p = q;
q = r;
}
// 断开原head和head->next,按照语义head的下一个
// 结点是下一段的首结点
**head->next = reverse( q, k );**
return p;
}
ListNode *swapPairs ( ListNode *head ) {
return reverse( head, 2 );
}
};