在链表前面增加一个头结点(无有效信息),指针p指向头结点,指针q指向第一个节点,指针m指向第二个节点,第一个节点和第二个节点交换后,三个指针往前移动2个节点,继续进行交换,注意最后返回的是头结点的next指向的节点而不是head指向的节点
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if (head == NULL || head->next == NULL)
return head;
ListNode *L = new ListNode(0);
L->next = head;
ListNode *q = head, *m = head->next,*p=L;
while (m != NULL){
q->next = m->next;
m->next = q;
p->next = m;
q = q->next;
if (q == NULL)
break;
q = q->next;
if (q == NULL)
break;
m = m->next->next;
p = p->next->next;
ListNode *tmp = m;
m = q;
q = tmp;
}
return L->next;
}
};