思路: 首先考虑终止条件:没有元素或者只有一个元素的时候停止;然后用递归公式,在最简单的情况下考虑,只有三部分:head t 和剩下的部分
代码:
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
//递归的方法
//终止条件:链表没有元素或者链表只有一个元素
if(!head || !head->next) return head;
//开始递归公式 考虑最简单的情况 head t t后面一大坨
ListNode* t = head->next;
head->next = swapPairs(head->next->next);//
t->next = head;
return t;
}
};
解题2:迭代
思路:主要是画图,画图过程把->next想明白就ok了,两两交换,需要有三个指针,返回链表,需要有哑节点
重点就是要画个图,在图上将next走明白,以及下一个pre走明白, 将哑节点设为pre,交换的是pre后面的两个节点
class Solution{
public:
ListNode* swapPairs(ListNode* head)
{
//容易搞混了,需要画图,设立一个dummy,pre,pre始终在要交换的两个数字的前面,即三个一堆,借鉴递归方法,head后来是成为第二个的
ListNode* dummy = new ListNode(0), *pre = dummy;
dummy->next = head;
while(pre->next && pre->next->next)
{
ListNode* t = pre->next->next;
pre->next->next = t->next;
t->next = pre->next;//前两个交换完毕,记住这条题主要是要记住交换的图
//前两个交换完毕就要开始往后挪pre
pre->next = t;//本来是连在head上的
pre = t->next;//往后移到位,开始新一轮交换 是pre后面的两个数交换
}
return dummy->next;
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)