当前位置: 首页 > article >正文

【LeetCode热题100】24. 两两交换链表中的节点(链表)

一.题目要求

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

二.题目难度

中等

三.输入样例

示例 1:
在这里插入图片描述
输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例 2:
输入:head = []
输出:[]

示例 3:
输入:head = [1]
输出:[1]

提示:
链表中节点的数目在范围 [0, 100] 内
0 <= Node.val <= 100

四.解题思路

解法1:迭代
解法2:递归

五.代码实现

迭代

/**
 * 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) {
        ListNode *dummy = new ListNode(-1);
        dummy->next = head;
        ListNode *lpre = dummy;
        ListNode *rpre = dummy->next;
        if(head == nullptr || head->next == nullptr) return head;
        while(lpre && rpre && rpre->next)
        {
            lpre->next = rpre->next;
            rpre->next = rpre->next->next;
            lpre->next->next = rpre;
            lpre = rpre;
            rpre = lpre->next;
        }
        return dummy->next;
    }
};

递归

/**
 * 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;
        }
        ListNode *newHead = head->next;

        head->next = swapPairs(newHead->next);
        
        newHead->next = head;

        return newHead;
    }
    
    
};

六.题目总结

递归分析

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        //递归出口
        if(head == nullptr ||head->next == nullptr)
        {
            return head;
        }
        //每一步递归的操作
        ListNode *newHead = head->next;
        head->next = swapPairs(newHead->next);   //目标不确定时候递归来确定 实际上head->next就是下一个递归的newHead
        
        newHead->next = head;
		
		//最终递归的头
        return newHead;
    }
    
};

http://www.kler.cn/a/271962.html

相关文章:

  • 局域网中 Windows 与 Mac 互相远程连接的最佳方案
  • AI 编程工具—Cursor进阶使用 Rules for AI
  • MySQL四种隔离级别
  • Java面试专题——面向对象
  • 深入剖析 Java 的本地方法接口(JNI)
  • 51c~SLAM~合集1
  • 树与二叉树(数据结构)
  • 前端学习之css伪元素选择器
  • sqlplus设置提示符
  • 【CenterFusion】模型的创建、导入、保存CenterFusion/src/lib/model/model.py
  • ApplicationListener 注册监听器来监听应用程序中发布的事件
  • 【Web开发】CSS教学(超详细,满满的干货)
  • C#八皇后算法:回溯法 vs 列优先法 vs 行优先法 vs 对角线优先法
  • 如何在WordPress网站上设置多语言展示
  • 系列学习前端之第 5 章:学习 ES6 ~ ES11
  • C语言经典面试题目(七)
  • 【Java刷题篇】串联所有单词的子串
  • Java常见问题:编辑tomcat运行环境、部署若伊系统
  • springboot使用socket和端口启动gRPC服务器的比较
  • 【计算机网络】什么是http?
  • 2.3 性能度量
  • 柔性数组(变长数组)介绍
  • 【C语言】字符函数与字符串函数以及内存函数 { 超详细攻略,一篇学会 }
  • Windows10中配置并使用nvidia-smi
  • jetson nano——编译一些包的网址导航,pyside2,qt(持续更新)
  • Nodejs 第五十六章(爬虫)