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

【剑斩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; } };
http://www.jsqmd.com/news/173182/

相关文章:

  • 大数据领域中Zookeeper与Kafka的协同工作模式
  • 大数据存储引擎:行式存储的底层实现与高效查询方案
  • 链路聚合问题
  • Java毕设项目推荐-基于SpringBoot社区医疗预约挂号平台的设计与实现医疗资源、挂号记录、就诊记录、问诊信息、报告解读、健康档案、社区互动【附源码+文档,调试定制服务】
  • 深度解析:基于流媒体协议的 FC2 视频内容解析与下载工程实践
  • 【更新至2024年】2007-2024年上市公司cnrds ESG评分数据
  • LaTeX如何加快编译速度 - Invinc
  • 可交互人工智能体:融合案例库与思维模型的MVP设计与实现
  • 心理模型、分层与个人认知 - ZJACK
  • 分块 莫队 总结
  • 英语_阅读_photo and food_待读
  • 【Linux】——从0到1的学习,让你熟练掌握,带你玩转Linux,教你安装Java常用软件、及spring boot项目部署 - 实践
  • 写的都队-beta冲刺
  • 痞子衡嵌入式:Farewell, 我的写博故事2025
  • 二0二午
  • 【Kubernetes】K8s 1.35 配置 Docker 作为容器运行时
  • 医疗数据用Git-LFS存储大文件稳住协作
  • 有实力的金包银有哪些
  • 使用GitHub CLI(gh)来创建 GitHub Issue
  • AI智能体在识别价值陷阱和价值机会中的作用
  • JDK各版本新增特性详解
  • 12月第一篇笔记
  • EZAccess安装注意事项及安装教程
  • 20232428 2025-2026-1 《网络与系统攻防技术》实验六实验报告
  • Java 垃圾回收器详解
  • 新爆料揭示:乔尼·艾维为OpenAI设计的神秘设备或为一支笔
  • Navicat 安装教程
  • 2026年元旦快乐
  • JAVA final 详解