C++算法练习-day9——24.两两交换链表中的节点

题目来源:. - 力扣(LeetCode)

题目思路分析

题目 :给定一个单链表的头节点 head,请你编写一个函数,将链表中的节点成对交换,返回交换后的链表头节点。

思路:

  1. 递归法 :
    • 终止条件:如果链表为空或只有一个节点,直接返回该节点。
    • 递归步骤 :
      • 设定一个新的头节点 newhead 为当前头节点的下一个节点(即要交换的第二个节点)。
      • 递归调用 swapPairs 函数,传入 newhead->next(即当前要处理的对之后的链表部分),并将结果赋值给当前头节点的 next。
      • 将 newhead 的 next 指向当前头节点,完成这一对节点的交换。
      • 返回新的头节点 newhead。

代码:

复制代码
/**  
 * 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==NULL || head->next==NULL){  
            return head;  
        }  
          
        // newhead 是当前要交换的第二个节点,也就是新链表的头节点  
        ListNode* newhead=head->next;  
          
        // 递归调用 swapPairs 函数,传入 newhead->next,即当前要处理的对之后的链表部分  
        // 将结果赋值给当前头节点的 next,完成递归链表的构建  
        head->next=swapPairs(newhead->next);  
          
        // 将 newhead 的 next 指向当前头节点,完成这一对节点的交换  
        newhead->next=head;  
          
        // 返回新的头节点 newhead  
        return newhead;  
    }  
};

知识点摘要

  1. 链表基础 :
    • 链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。
    • 单链表是指每个节点只有一个指向下一个节点的指针。
  2. 递归 :
    • 递归是一种解决问题的方法,其中函数直接或间接地调用自身。
    • 递归函数通常包含一个或多个基准条件,用于终止递归调用。
  3. 链表节点交换 :
    • 链表节点交换通常涉及调整节点间的指针,而不是数据值本身。
    • 在本问题中,通过调整指针实现节点对的交换。

通过这道题目,我们学会了如何使用递归方法解决链表节点成对交换的问题。递归方法虽然简洁,但也需要仔细考虑基准条件和递归步骤,以避免陷入无限递归或导致内存泄漏。此外,对链表操作的理解也是解决此类问题的关键,特别是节点指针的调整。通过实践,我们可以更好地掌握递归和链表操作的相关知识,为更复杂的问题打下坚实的基础。

相关推荐
wdfk_prog2 分钟前
lwip教程 38:从 `lwipopts.h` 到 Port Contract——lwIP 裁剪、构建选择、OS Port 与 Network Port
java·开发语言
开开心心就好5 分钟前
证件照排版打印工具,免费可自定义尺寸
服务器·开发语言·算法·随机森林·pdf·音视频·散列表
我是高手高手高高手11 分钟前
宝塔 PHP多版本,切换PHP默认版本
开发语言·php
CodeYp201911 分钟前
第16讲:set 和 map 的使用
开发语言·c++·set·map
物联网老王13 分钟前
第05篇-Agent 连不上工具?MCP 就是那根“USB-C”
开发语言·人工智能·ai·aigc·ai编程
傲世仙尊21 分钟前
vector起步与底层-三个指针迭代器失效与为模板升级内置类型
c++
誰能久伴不乏3 小时前
桌面客户端的运行日志系统:SQLite 分块 + 独立写线程 + 文本降级
数据库·c++·qt·架构·sqlite
2601_966949657 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
晨曦中的暮雨9 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
喵了几个咪10 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang