news 2026/2/10 5:13: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/9 3:57:59

软件测试常考面试题及参考答案(待更新)

笔试题 1、HTTP协议有什么特点?有哪几类状态码,分别表示什么意思? 特点: * 无连接:限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。 * 媒体独立:只要客…

作者头像 李华
网站建设 2026/2/7 2:12:01

Java 泛型详解

1. 泛型概述1.1 什么是泛型泛型(Generics)是JDK 5引入的特性,允许在定义类、接口和方法时使用类型参数,提供编译时类型安全检查,避免运行时类型转换异常。1.2 泛型的好处类型安全:编译时检查类型消除强制转…

作者头像 李华
网站建设 2026/2/8 4:07:55

构建基于NLP的金融社交媒体影响力量化模型

构建基于NLP的金融社交媒体影响力量化模型 关键词:自然语言处理(NLP)、金融社交媒体、影响力量化模型、文本分析、量化金融 摘要:本文聚焦于构建基于自然语言处理(NLP)的金融社交媒体影响力量化模型。随着社交媒体在金融领域的影响力日益增强,如何准确量化其对金融市场和…

作者头像 李华
网站建设 2026/2/10 20:52:32

NVIDIA AI Associate

Day 1 GPU 架构与 AI 加速底座全解析0. 前言在 NVIDIA 生成式 AI 认证考试中,底层硬件知识占比约 15-20%。工程师不仅要懂算法,更要懂算力是如何在晶体管层面流动的。本章重点解决:为什么 AI 必须用 GPU?NVIDIA 的硬件凭什么领先&…

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

2025的10个灵魂拷问:比新年计划更有用

年末不止是时间的节点,更是自我梳理的契机。比起盲目制定新年计划,先做好年度反思,才能找准成长方向。这10个深度问题,帮你盘点2025的得与失,为2026的前行蓄力!1.目标达成:年初核心目标与年末现…

作者头像 李华
网站建设 2026/2/10 3:41:39

【语音识别】基于K近邻分类算法的语音情感识别附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

作者头像 李华