题目描述:
思路:直接模拟,先写一个大概的框架,然后各种修修补补:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* p = head;
if(head == NULL){
return head;
}
ListNode* q = head -> next;
ListNode* ans = q; //最后返回的是2号节点
if(q == NULL){
return head;
}
ListNode* temp;
ListNode* temp0;
while(true){
temp = q -> next;
q -> next = p;
p -> next = temp;
temp0 = p;
if(p -> next != NULL){//p -> next == NULL的话表示已经交换完毕了
p = p -> next;
q = q -> next -> next -> next;
if(q == NULL) break;//处理奇数情况
else{
temp0 -> next = q;//这步表示,比如1,2,3,4交换后得2,1,4,3.那么temp0为1,q为4,要让1 -> next = 4
}
}
else{
break;
}
}
return ans;
}
};
写得比较乱,这题也可以加个头结点来做,参考了下别人的代码,要简洁得很多:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummy=new ListNode(0);
dummy->next=head;
ListNode* prev=dummy;
while(head &&head->next)
{
ListNode* nn=head->next->next;
prev->next=head->next;
head->next->next=head;
head->next=nn;
prev=head;
head=nn;
}
return dummy->next;
}
};