24. 两两交换链表中的节点
1.迭代交换
- 本题可以重复进行三次操作完成交换,具体操作如下图所示,是链表的基本操作,体现了链表结构的思维。
-
class Solution { public: ListNode* swapPairs(ListNode* head) { ListNode* result=new ListNode(); result->next=head; ListNode* dummy=result; while(dummy->next!=nullptr&&dummy->next->next!=nullptr){ ListNode *temp=dummy->next; ListNode *temp2=dummy->next->next; dummy->next=temp2; temp->next=temp2->next; temp2->next=temp;//三次操作完成交换 dummy=dummy->next->next;//交换后dummy节点前进 } return result->next; } };
2.递归操作
-
从迭代解法中不难发现,两两交换节点就是再重复做一个三次交换的操作,我们可以把这三次交换放入递归函数中。
-
本题的递归很好分析:swapPairs函数完成的功能是交换head节点后面的两个节点,因此完成交换之后,从新的head节点继续递归。跳出条件也很明显:head为空或者head->next为空。
-
class Solution { public: ListNode* swapPairs(ListNode* head) { if(head==nullptr||head->next==nullptr){ return head; } ListNode *temp2=head->next; head->next=swapPairs(temp2->next); temp2->next=head; return temp2; } };