夯实C++基础之刷题:链表——6 两两交换链表中的节点

夯实C++基础之刷题:链表——6 两两交换链表中的节点,第1张

题目

解题1:递归

思路: 首先考虑终止条件:没有元素或者只有一个元素的时候停止;然后用递归公式,在最简单的情况下考虑,只有三部分: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;
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/569266.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存