news 2026/2/4 22:53:14

【剑斩OFFER】算法的暴力美学——两两交换链表中的结点

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【剑斩OFFER】算法的暴力美学——两两交换链表中的结点

一、题目描述

二、算法原理

思路:引入哨兵位 + 3 个指针

为什么要引入哨兵位?当我们实现完第一次交换时:

prev 的 next 要指向 cur ,所以引入哨兵位,这样一次循环就能搞定交换两两结点;这里我为什么要引入 nnext ?其实是为了方便对两个结点时的交换。

循环结束的条件:

当结点为偶数时:next == nullptr 就结束循环

当结点为奇数时:cur == nullptr 就结束循环

三、代码实现

/** * 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* prev = new ListNode(0,head); ListNode* cur = head,*next = head->next,*nnext = next->next,*ret = next; while(cur && next) { next->next = cur; cur->next = nnext; prev->next = next;//对交换后的结点进行连接 prev = cur;//开始更新 cur 、prev 、 next 、nnext cur = nnext; if(cur) next = cur->next; else break; if(next) nnext = next->next; } return ret; } };

探索性代码:

/** * 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* ret = nullptr; if(head == nullptr || head->next == nullptr) return head; else ret = head->next;//保存第一次交换的头结点 ListNode* prev = head; ListNode* cur = head->next; ListNode* tmpnode = nullptr; ListNode* swapnode = nullptr;//保存交换后的prev while(cur != nullptr)//使用临时变量来进行两两交换 { tmpnode = cur->next; cur->next = prev; prev->next = tmpnode; if(swapnode) swapnode->next = cur;//第二次,两两交换时,要把 prev 前一个结点链接上交换后的 cur swapnode = prev; prev = tmpnode; if(prev) cur = prev->next; else break; } return ret; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/4 3:30:09

用QuantConnect Lean打造算法交易的利器

LEAN算法交易引擎概述 LEAN是一个专业级的算法交易平台,由QuantConnect团队开发,支持 Python 和 C# 语言。该平台具备事件驱动的架构,适用于量化开发者,旨在帮助用户轻松构建和测试交易算法。LEAN不仅支持多种金融市场的回测和实…

作者头像 李华
网站建设 2026/1/28 10:02:49

医疗数据用Git-LFS存储大文件稳住协作

📝 博客主页:jaxzheng的CSDN主页 医疗数据协作新范式:Git-LFS如何稳住大文件存储目录医疗数据协作新范式:Git-LFS如何稳住大文件存储 引言:医疗数据协作的“大文件困境” 现在时:Git-LFS在医疗协作的落地实…

作者头像 李华
网站建设 2026/2/4 13:30:03

JDK各版本新增特性详解

一、JDK 8&#xff08;LTS&#xff0c;2014年3月&#xff09;- 革命性更新 核心特性 Lambda表达式 // 旧方式 Collections.sort(list, new Comparator<String>() {Overridepublic int compare(String a, String b) {return a.compareTo(b);} });// Lambda方式 Collect…

作者头像 李华
网站建设 2026/1/27 0:52:25

Java计算机毕设之基于SpringBoot社区医疗预约挂号平台的设计与实现基于springboot的医院挂号就诊系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/1/28 10:33:19

如何跟上当今AI高速发展的步伐

如何跟上当今AI高速发展的步伐&#xff0c;这正是我们时代最关键的问题之一。跟上AI时代的步伐&#xff0c;并非要每个人都成为技术专家&#xff0c;而是要建立一种“AI优先”的思维模式和行动策略。以下是一套从思想到行动的系统性建议&#xff0c;希望能为你提供清晰的路径&a…

作者头像 李华
网站建设 2026/2/4 6:16:37

Android 命令行打包 APK 完全指南|极速构建不求人

告别 Android Studio 漫长等待&#xff0c;一行命令 30 秒完成 APK 打包&#xff01;本文详解 Gradle 命令行构建的所有技巧。 前言 每次用 Android Studio 打包 APK&#xff0c;你是不是都要经历&#xff1a; 点击 Build → Generate Signed Bundle / APK选择 APK&#xff0…

作者头像 李华