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

【C++算法】52.链表_两两交换链表中的节点

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:


题目链接:

24. 两两交换链表中的节点


题目描述:

7fc438fb548cfbd03cde4bf15da2675e


解法

解法一:递归

解法二:循环

5b51f410128e89243c85368c6e9fe13e


C++ 算法代码:

/**
 * 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 = new ListNode(0);
        newHead->next = head;

        // 初始化四个指针用于交换操作
        ListNode* prev = newHead;        // 指向要交换的两个节点的前一个节点
        ListNode* cur = prev->next;      // 指向第一个要交换的节点
        ListNode* next = cur->next;      // 指向第二个要交换的节点
        ListNode* nnext = next->next;    // 指向交换完成后的下一对节点的第一个节点

        // 当有一对节点可以交换时继续循环
        while(cur && next)
        {
            // 交换节点:更改指针指向,实现两两交换
            prev->next = next;         // 前一个节点指向第二个节点
            next->next = cur;          // 第二个节点指向第一个节点
            cur->next = nnext;         // 第一个节点指向下一对节点的第一个节点

            // 更新指针,准备处理下一对节点
            prev = cur;                // 更新prev指向当前已交换的第一个节点
            cur = nnext;               // 更新cur指向下一对的第一个节点
            if(cur) next = cur->next;  // 如果cur存在,更新next
            if(next) nnext = next->next; // 如果next存在,更新nnext
        }

        // 获取结果链表的头节点(跳过虚拟头节点)
        cur = newHead->next;
        delete newHead;                // 释放虚拟头节点的内存
        return cur;                    // 返回新的头节点
    }
};
http://www.dtcms.com/a/118663.html

相关文章:

  • 分布式防护节点秒级切换:实战配置与自动化运维
  • FTP协议和win server2022安装ftp
  • HarmonyOS-ArkUI Ability进阶系列-各类生命周期总结
  • 网络安全应急响应-日志分析
  • 核心机制与主流协议解析
  • vim定位有问题的脚本/插件的一般方法
  • 蓝桥杯基础算法-递归
  • Efficient Burst Raw Denoising:稳定噪声方差和分频率降噪
  • EMA注意力机制
  • 数字游戏(继Day 10)
  • FreeRTOS临界区
  • mybatis是如何进行分页的?分页插件的原理是什么
  • 【学习笔记】HTTP和HTTPS的核心区别及工作原理
  • w283图书商城管理系统
  • Docker全方位指南
  • 嵌入式---加速度计
  • 原子化 CSS 的常见实现框架
  • 微软 SC-900 认证-考核Azure 和 Microsoft 365中的安全、合规和身份管理(SCI)概念
  • 从光波调制到温度补偿:Lilikoi光纤力传感器的核心技术拆解
  • 麦科信光隔离探头在碳化硅(SiC)MOSFET动态测试中的应用
  • Glowroot 是一个开源的 Java 应用性能监控(APM)工具,专为 低开销、易用性 设计,具体的应用及优势进行分析说明
  • 【Docker基础-镜像】--查阅笔记2
  • MySQL 查询重写怎样把复杂查询变简单,让查询提高一个“速”!
  • TCP三次握手和TCP四次挥手
  • 7-9 用天平找小球
  • HOW - 设计和实现一个动态渲染不同表单类型组件的 DynamicFormItem 组件
  • SpringBoot框架—Logger使用
  • golang 中 make 和 new 的区别?
  • 力扣刷题——2265.统计值等于子树平均值的节点数
  • 国产三维CAD皇冠CAD在机械制造行业建模教程:油泵