【Leetcode每日一题】 递归 - 两两交换链表中的节点(难度⭐)(38)

1. 题目解析

题目链接:24. 两两交换链表中的节点

这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

2.算法原理

一、理解递归函数的含义

首先,我们需要明确递归函数的任务:给定一个链表,我们要对这个链表进行两两交换,然后返回交换后的链表的头节点。这就像是给链表做一个“翻转”的小魔术,每两个节点就会交换位置。

二、逐步拆解问题

  1. 处理后续链表
    在递归函数中,我们首先要做的是处理当前节点的下一个节点开始的链表。为什么要这么做呢?因为如果我们直接交换当前节点和下一个节点,那么当前节点之后的链表就可能会失去连接。所以,我们需要先确保后面的链表已经被正确地处理好了。
  2. 交换当前两个节点
    当我们处理完后面的链表后,就可以放心地交换当前节点和下一个节点了。这就像是在玩扑克牌,我们先处理好手中的一部分牌,然后再交换最上面的两张牌。
  3. 连接处理后的链表
    交换完当前两个节点后,我们需要将这两个节点与后面已经处理好的链表连接起来。这样,整个链表就被完整地连接起来了。

三、确定递归的出口

当然,递归函数不能一直递归下去,它需要一个出口。这个出口就是当链表为空或者只有一个节点时。因为在这两种情况下,我们都不需要进行交换操作,所以直接返回当前节点即可。

四、tips:画图理解链表操作

在处理链表问题时,一个非常好的习惯就是画图。通过画图,我们可以更直观地理解链表的结构和指针的操作。这样,即使问题再复杂,我们也能轻松应对。

3.代码编写

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution 
{
public:
    ListNode* swapPairs(ListNode* head) 
    {
        if(head == nullptr || head->next == nullptr) return head;
        auto tmp = swapPairs(head->next->next);
        auto ret = head->next;
        head->next->next = head;
        head->next = tmp;
        return ret;
    }
};

The Last

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~ 

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-17 23:34:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-17 23:34:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-17 23:34:02       82 阅读
  4. Python语言-面向对象

    2024-03-17 23:34:02       91 阅读

热门阅读

  1. mvcc介绍

    2024-03-17 23:34:02       41 阅读
  2. Linux内核开发与优化

    2024-03-17 23:34:02       45 阅读
  3. QT 状态机的使用

    2024-03-17 23:34:02       40 阅读
  4. 折半搜索 笔记

    2024-03-17 23:34:02       43 阅读
  5. [小程序开发] 组件生命周期

    2024-03-17 23:34:02       43 阅读
  6. 力扣爆刷第97天之hot100五连刷71-75

    2024-03-17 23:34:02       35 阅读
  7. 克服大型语言模型幻觉使用检索增强生成(RAG)

    2024-03-17 23:34:02       37 阅读
  8. Leetcode 1046. 最后一块石头的重量

    2024-03-17 23:34:02       40 阅读
  9. c# 的ref 和out

    2024-03-17 23:34:02       43 阅读
  10. 安卓UI面试题 45-50

    2024-03-17 23:34:02       40 阅读
  11. bootstrap精选模板tabler下载

    2024-03-17 23:34:02       38 阅读
  12. C#+datax实现定时增量同步

    2024-03-17 23:34:02       50 阅读
  13. Git的一些基础命令

    2024-03-17 23:34:02       49 阅读