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

OJ 两两交换链表中的节点

题目:

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

示例:

代码分析:

class Solution {
public:ListNode*_swap(ListNode*cur){//判断当前节点是否是空的(cur一开始是接收头节点,同时后面还会接收未节点),//如果是空的则直接返回if(cur==nullptr) return nullptr;//如果该节点的下一个是空,那么没有交换的必要if(cur->next==nullptr) return cur;//设置当前节点的后一个节点的后一个节点,这样方便指针的指向和之后的递归操作ListNode*_next=cur->next->next;//记录当前节点的下一个节点ListNode* second = cur->next;//进行节点指向的改变,将当前节点的后一个节点的后一个节点的 next指针指向当前节点cur->next->next =cur;//也就是让当前节点的 下一个节点 的next指针指向当前节点//利用递归操作进行递归当前节点的下一个节点cur->next = _swap(_next);最后返回return second;}ListNode* swapPairs(ListNode* head) {return _swap(head);}
};
  • 根据示意图可以得出,链表上的节点是前后节点进行交换的,所以需要该动前后节点的指针指向,这里使用递归的方式进行改动。
  • swap(ListNode* cur)
    • 这是一个递归函数,用于递归地处理链表,直到链表结束(即遇到 nullptr 或只有一个节点时)。
    • 函数的参数 cur 是当前正在处理的节点。
    • 如果 cur 是 nullptr 或 cur->next 是 nullptr(即链表为空或只有一个节点),则函数直接返回 cur,因为没有节点对可以反转。
    • 否则,函数首先保存 cur->next->next(即当前节点的下一个节点的下一个节点,记作 _next)以便后续递归调用。
    • 然后,它执行“翻转”操作:将 cur->next 的 next 指针指向 cur,从而实现了一对节点的逻辑反转。
    • 接着,它递归地调用自身来处理剩余的链表(从 _next 开始)。
    • 最后,函数返回 cur->next,即新链表的头节点(因为 cur 和 cur->next 已经交换了位置)。
  • swapPairs(ListNode* head)
    • 这是对外的接口函数,用于启动反转每对节点的过程。
    • 它简单地调用了 _swap(head) 并返回结果。

 

题目来源:24. 两两交换链表中的节点 - 力扣(LeetCode)

 题解来自于:Lucifer厄同_roc. - 力扣(LeetCode)


http://www.mrgr.cn/news/25408.html

相关文章:

  • MySQL之库和表操作
  • Python容器一之字符串
  • 好看好听的小猪包扩音器,轻巧便携更好用,得胜E10上手
  • 批量插入insert到SQLServer数据库,BigDecimal精度丢失解决办法,不动代码,从驱动层面解决
  • 干部画像系统是什么?
  • 卫生间漏水原因很多,切莫病急乱投医
  • 直播电商平台如何合理分账给供应商/主播
  • 基于SpringBoot的准妈妈孕期交流平台
  • 开源模型应用落地-qwen2-7b-instruct-LoRA微调-unsloth(让微调起飞)-单机单卡-V100(十六)
  • Vue3使用Websocket进行跨页面通信
  • Vue路由的分类与使用
  • 缓存预热/雪崩/穿透/击穿
  • 牛客小白月赛99(下)
  • Shell脚本-拆分文件并重命名(性能测试)
  • 记一次幸运的漏洞挖掘
  • 植物三萜皂苷生物合成途径及调控机制研究进展-文献精读48
  • 【数据结构-一维差分】力扣1893. 检查是否区域内所有整数都被覆盖
  • Linux和C语言(Day 12)
  • java基于PDF底层内容流的解析对文本内容进行编辑
  • Arduino 2线串行 通信 驱动 LCD 12864