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.
#include <iostream>
#include <vector>
#include <string>
#include <cstdio>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode(int x):val(x),next(NULL) {}
};
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(head == NULL) return head;
ListNode *h = head;
ListNode *pre = head;
for(; head != NULL;) {
ListNode *cur = head;
ListNode *next = head->next;
if(next != NULL) {
next = next->next;
if(pre == h) {
pre = cur->next;
cur->next->next = cur;
cur->next = next;
h = pre;
} else {
pre->next = cur->next;
cur->next->next = cur;
cur->next = next;
}
pre = cur;
head = pre->next;
} else {
break;
}
}
return h;
}
};