给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
思路:
递归或者循环都能解决。用循环交换节点有点复杂,建议用草稿纸画图解决。以前刷题的时候几乎不动笔,直接上手代码,边敲边想,经常性的被一个小细节给绕的头昏脑胀,现在明白过来,还是得动笔,因为大脑的记忆容量有限,不动笔思路伸展不开,想了前面忘了后面。好了回到题目上。我们画个图问题就能解决。
代码:
递归:
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(head&&head->next){
ListNode* next=head->next;
head->next=swapPairs(next->next);
next->next=head;
return next;
}
return head;
}
};
循环:
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* h=new ListNode(0);
ListNode* pre=h;
while(head&&head->next){
pre->next=head->next;
ListNode* t=head->next->next;
head->next->next=head;
head->next=t;
pre=head;
head=head->next;
}
if(head)pre->next=head;
return h->next;
}
};