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

题目

在这里插入图片描述

解题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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值