Day4 链表
LeetCode 24.两两交换链表中的节点【链表/递归】
本题还是有一定难度的,思考了很长时间没有翻明白指针的迭代方法,还需要好好学习和思考。
解法1:迭代
朴素解法,思路就是让cur指向2,然后再令2指向1,1再指向3,在此过程中由于指针的改变必须按照这个顺序进行,就会导致后面的节点丢失,为了防止出现这种情况,我们就要提前存储后面两个节点。有理有据,行云流水,令人拍案。
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummyHead=new ListNode(0);
dummyHead->next=head;
ListNode* cur=dummyHead;
while(cur->next!=nullptr && cur->next->next!=nullptr){
ListNode* tmp=cur->next;
ListNode* tmp1=cur->next->next->next;
cur->next=cur->next->next;
cur->next->next=tmp;
cur->next->next->next=tmp1;
cur=cur->next->next;
}
return dummyHead->next;
}
};
解法2:递归
链表用递归到底是哪些神人想出来的,简洁的代码却内藏玄机,搞明白思路之后更是佩服的五体投地orz。
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(head==nullptr || head->next==nullptr) return head;
ListNode* cur=head->next;
ListNode* tmp=head->next->next