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

递归-迭代

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

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

递归解法
// 注意:cpp 代码由 chatGPT🤖 根据我的 java 代码翻译。
// 本代码的正确性已通过力扣验证,如有疑问,可以对照 java 代码查看。class Solution {
public: // Ensure that swapPairs is public// 定义:输入以 head 开头的单链表,将这个单链表中的每两个元素翻转,// 返回翻转后的链表头结点ListNode* swapPairs(ListNode* head) {if (head == nullptr || head->next == nullptr) {return head;}ListNode* first = head;ListNode* second = head->next;ListNode* others = head->next->next;// 先把前两个元素翻转second->next = first;// 利用递归定义,将剩下的链表节点两两翻转,接到后面first->next = swapPairs(others);// 现在整个链表都成功翻转了,返回新的头结点return second;}
};
迭代解法

// 虚节点的重要性

// 方法二:迭代 
class Solution {
public:ListNode* swapPairs(ListNode* head) {ListNode* dummyHead = new ListNode(0);dummyHead->next = head;ListNode* temp = dummyHead;while (temp->next != nullptr && temp->next->next != nullptr) {ListNode* node1 = temp->next;ListNode* node2 = temp->next->next;temp->next = node2;node1->next = node2->next;node2->next = node1;temp = node1;}ListNode* ans = dummyHead->next;delete dummyHead;return ans;}
};

如果不加哨兵节点,则需要对头节点进行特殊处理:

// 不加dummy 节点的版本
class Solution {
public:ListNode* swapPairs(ListNode* head) {if (head == nullptr || head->next == nullptr) {return head;}ListNode* pNode = head;head = head->next;// 对头节点的交换需要特殊处理,因为头节点的前一个节点为空   ListNode* node1 = pNode;ListNode* node2 = pNode->next;    // 交换节点node1->next = node2->next;node2->next = node1;pNode = node1;while (pNode->next != nullptr && pNode->next->next != nullptr) {ListNode* node1 = pNode->next;ListNode* node2 = pNode->next->next;    // 交换节点pNode->next = node2;node1->next = node2->next;node2->next = node1;pNode = node1;}return head;  }
};
http://www.lryc.cn/news/490468.html

相关文章:

  • 恋爱通信史之完整性
  • Docker 容器的初始化设置
  • 密码编码学与网络安全(第五版)答案
  • C++初阶(十四)--STL--vector的模拟实现
  • 贴代码框架PasteForm特性介绍之query,linkquery
  • 高防IP如何构建安全高效的数字政务新生态
  • 数据结构与算法——1122—复杂度总结检测相同元素
  • HTML通过JavaScript获取访问连接,IP和端口
  • 自动化测试过程操作细节
  • AR智能眼镜|AR眼镜定制开发|工业AR眼镜方案
  • 从〇开始深度学习(0)——背景知识与环境配置
  • 实验室管理技术革新:Spring Boot系统
  • C语言 蓝桥杯某例题解决方案(查找完数)
  • Prompting LLMs to Solve Complex Tasks: A Review
  • C++ 编程指南05 - 编译时检查优于运行时检查
  • 【优先算法】专题——双指针
  • CSP/信奥赛C++语法基础刷题训练(23):洛谷P1217:[USACO1.5] 回文质数 Prime Palindromes
  • C语言练习.if.else语句.strstr
  • 利用浏览器录屏
  • python中的map、split、join函数的作用 => ACM输入输出流
  • Ubuntu20.04下安装向日葵
  • 常用并发设计模式
  • Redis Search系列 - 第七讲 Windows(CygWin)编译Friso
  • 利用Docker容器技术部署发布web应用程序
  • [免费]SpringBoot+Vue毕业设计论文管理系统【论文+源码+SQL脚本】
  • BFS 算法专题(五):BFS 解决拓扑排序
  • 【Mysql】开窗聚合函数----SUM,AVG, MIN,MAX
  • java操作doc——java利用Aspose.Words操作Word文档并动态设置单元格合并
  • 探索 .NET 9 控制台应用中的 LiteDB 异步 CRUD 操作
  • 《进程隔离机制:C++多进程编程安全的坚固堡垒》