LeetCode--24.两两交换链表中的结点

解题思路:

1.获取信息:

给了一个链表,要求两两一组地交换位置

限定条件:只能进行结点交换,不能修改结点内部的值

额外条件:结点数在0-100的范围,闭区间

2.分析题目:

这里的两两一组不是每次取相邻的两个,而是,如果你取了第一个和第二个结点为一组,那么下一组就只能是第三个结点和第四个结点为一组,以此类推

在这个环节,我就不说我写出各个方法的思路了,这些思路放在各个方法的下面借着代码来帮助你理解

3.示例查验:

示例1:(有时候你要借助题目和示例才能更好地理解题目要求,以免出现歧义)验证了我分析题目环节中的想法,其实我一开始想的是我说的那个错误的想法的,看见这个示例才改正了思路

示例2:链表为空,返回空

示例3:链表中只有一个结点,返回那个结点

4.尝试编写代码:

(1)反骨法:

虽然它说,不让你改变结点内部的值,但我偏要改变,我就是反骨,就要忤逆一下你,行不行呢?

当然是可以的,下面我也会说一下这个方法的思路,但是还是建议按照题目好好去做,给自己加一些限制总是能提升自己的

思路:将链表中的每个结点内部的值都储存在一个vector中,在遍历结点的时候,再进行两两赋值即可,以下是完整代码

cpp 复制代码
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        vector<int>nums(100,-1);//分配100个空间大小,全部初始化为-1
        ListNode*dummy=head;
        ListNode*temp=head;
        int n=0;
        while(dummy!=nullptr){//取出每个结点内部的值
            nums[n]=dummy->val;
            dummy=dummy->next;
            n++;
        }
        for(int i=0;i<n-1;i+=2){//遍历链表进行两两赋值
            head->val=nums[i+1];
            head->next->val=nums[i];
            head=head->next->next;
        }
        return temp;
    }
};

下面的方法就是正规的交换链表中的结点的方法了,上面的方法看看就行了,毕竟不正规

(2)迭代法

思路:通过迭代的方法交换两两组合

其实交换两个结点不是很难,选取哪两个结点进行交换也不是很难

难的是,你能不能够断干净和连上该连的结点,下面我会用一张图来提醒你一下易错点

以下是完整的代码

cpp 复制代码
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(head==nullptr||head->next==nullptr)return head;//如果当前结点为空或者当前结点的下一结点为空,就返回当前结点
        ListNode*pre=head;//备份当前结点(这里只是用于初始化,象征用一下,下面的用途就是存储上一次的当前结点,你实在不懂得话,我这样说吧,就是我迭代法里面的那张图片中的值为1的结点)
        ListNode*dum=head->next;//当前结点的下一结点(因为交换后,它就变成头结点了嘛)
        while(head!=nullptr&&head->next!=nullptr){//如果当前结点为空且当前结点的下一结点为空,就退出循环
            ListNode*temp=head->next;//当前结点的下一结点
            pre->next=temp;//上一次的当前结点指向这一次的当前结点的下一结点
            head->next=temp->next;
            temp->next=head;
            pre=head;//备份这次的当前结点(用于指向下一次的当前结点的下一结点)
            head=head->next;//移动这次的当前结点到下一次的当前结点
        }
        return dum;
    }
};

(3)递归法

思路:通过递归的方法进行交换两两组合

我们将两个结点交换后,可以将它们看作是一个整体,它们指向的是下一个两两组合

例如,第一次交换组合的时候,你交换了第一个结点(M结点)和第二个结点(N结点),那我们把它们看作是一个整体,从链表中取出来,此时M结点指向的下一结点就是,后续经过两两交换的(已经取出来M结点和N结点)链表的头结点对不对

那么依次类推,第二次交换组合的时候也是这样,直到所有的两两组合被交换完

文字比较无力,如果你看不懂,那就看我下面的代码吧,如果你迭代法没有看懂的话,这个你可能也看不懂,这一个更加的精妙

你实在不懂的话,建议你去做一下力扣21题,它的方法启发了我写出来递归法

cpp 复制代码
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(head==nullptr)return nullptr;//结点为空
        if(head->next==nullptr)return head;//下一结点为空
        ListNode*temp=head->next;//当前结点的下一结点
        head->next=temp->next;//交换操作
        temp->next=head;//交换操作
        head->next=swapPairs(head->next);//这就是我上面思路的最好诠释
        return temp;
    }
};

希望你能有所收获,我也算不虚此行嘛

还是提一嘴,纸上得来终觉浅,绝知此事要躬行

相关推荐
森焱森23 分钟前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
ytttr8731 小时前
matlab通过Q学习算法解决房间路径规划问题
学习·算法·matlab
go54631584652 小时前
修改Spatial-MLLM项目,使其专注于无人机航拍视频的空间理解
人工智能·算法·机器学习·架构·音视频·无人机
油泼辣子多加2 小时前
【Torch】nn.BatchNorm1d算法详解
算法
nlog3n2 小时前
基于 govaluate 的监控系统中,如何设计灵活可扩展的自定义表达式函数体系
算法·go
IT古董3 小时前
【第三章:神经网络原理详解与Pytorch入门】01.神经网络算法理论详解与实践-(2)神经网络整体结构
pytorch·神经网络·算法
ThetaarSofVenice3 小时前
垃圾收集相关算法Test
java·jvm·算法
小陈phd3 小时前
langchain从入门到精通(二十八)——RAG优化策略(六)集成多种检索器算法实现混合检索及问题转换总结
算法
是小王同学啊~3 小时前
(LangChain)RAG系统链路向量检索器之Retrievers(五)
python·算法·langchain
薰衣草23333 小时前
一天两道力扣(1)
算法·leetcode·职场和发展