版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/musechipin/article/details/85243994
题目描述:https://leetcode.com/problems/swap-nodes-in-pairs/
这个题的难点在于,一个链表例如1->2->3->4,如果两两分组,执行12交换、34交换这样的步骤,12交换后工作并没有完成,1后面应该链接的是交换后的4,3后面连接的也应该是交换后的链表。
有两个解决办法,一个是利用回溯:
class Solution {
public:
ListNode * swapPairs(ListNode * head) {
if (head==NULL||head->next==NULL) return head;
ListNode *tmp=head->next;
head->next=swapPairs(tmp->next);
tmp->next=head;
return tmp;
}
};
另一个办法是将需要交换的两个节点的前一个节点也看做这一组的内容,每次调整三个节点的关系,这样也能解决如果是单数个节点最后一个不用调整的问题。画个图就很明确了。
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* res=new ListNode(0);
res->next=head;
ListNode* a=res;
while (a->next!=NULL && a->next->next!=NULL)
{
ListNode* b=a->next->next;
a->next->next=b->next;
b->next=a->next;
a->next=b;
a=b->next;
}
return res->next;
}
};