想要精通算法和SQL的成长之路 - 两两交换链表中的节点

  • 前言
  • 一. 两两交换链表中的节点

前言

想要精通算法和SQL的成长之路 - 系列导航

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

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

写这道题目之前,可以先看下 反转链表。这题只不过是它的一个进阶版。

思路如下(借用了代码随想录的思路图):

按照红色的箭头进行指针变更,不过有几个值得注意的点给大家说下:

  1. 我们需要用一个虚拟指针 h。并使得 h.next = head;。这样做的目的:使得原链表的所有节点按照统一的方式进行操作替换。否则头结点就可能需要单独处理。
  2. 在修改指针的时候,我们往往需要使用几个临时变量去存储指针对象。这样做的目的:因为一旦值被替换了,原值就不复存在了,那就无法进行值/引用的交换了。
  3. 这类反转的题目,一定要手动画图,整理好顺序,写代码就方便容易理解了。

例如以下代码:

int a = 1,b = 2;
a=b;
b=a;

上面的值交换的写法就是错误的。最终a和b的值都是2。正确的应该是:

int a = 1, b = 2;
int tmp = b;
b = a;
a = tmp;

其实这是个很简单的道理,但是往往在链表的指针替换时候,很多人却不知道为什么这样做(有可能都是nextpre的操作,整蒙圈了)。

最终代码如下:

public ListNode swapPairs(ListNode head) {// 构建一个虚拟节点ListNode h = new ListNode(0);h.next = head;ListNode cur = h;while (cur.next != null && cur.next.next != null) {// 把这两个值缓存起来ListNode tmp1 = cur.next;ListNode tmp2 = cur.next.next.next;// 第一步,相邻节点的头结点变更cur.next = cur.next.next;// 第二步:相邻节点之间的引用互换cur.next.next = tmp1;// 第三部,相邻节点的尾结点变更cur.next.next.next = tmp2;// 当前节点往后移动两位,进入下一层循环cur = cur.next.next;}// 返回链表return h.next;
}

想要精通算法和SQL的成长之路 - 两两交换链表中的节点相关推荐

  1. 想要精通算法和SQL的成长之路 - 第N高的薪水(SQL)

    想要精通算法和SQL的成长之路 - 第N高的薪水(SQL) 前言 一. 第二高的薪水 1.1 offset 的使用 1.2 ifnull 的使用 1.3 分页查询 1.3 总结 二. 第N高的薪水 前 ...

  2. 想要精通算法和SQL的成长之路 - 超过经理收入的员工(SQL)

    想要精通算法和SQL的成长之路 - 超过经理收入的员工(SQL) 前言 一. 超过经理收入的员工 1.1 自连接 1.2 子查询 1.3 join 语句 前言 想要精通算法和SQL的成长之路 - 系列 ...

  3. 想要精通算法和SQL的成长之路 - 判断子序列问题

    想要精通算法和SQL的成长之路 - 判断子序列问题 前言 一. 判断子序列 1.1 动态规划做法 1.2 双指针 二. 不同的子序列 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 判断子序 ...

  4. 好想学python机器人_【Python成长之路】从零学GUI -- 制作智能聊天机器人

    [写在前面] 鹏哥:最近老惹小燕同学不开心,结果都没人陪我聊天了.哎,好无聊呀! 肥宅男:女朋友什么的最无聊了,还没我的图灵机器人好玩. 鹏哥:图灵?好巧,和我部门同名. [效果如下] [实现过程] ...

  5. C语言基于FOC控制算法和STM32主控芯片的双路直流无刷电机控制器源码

    [FOC+STM32]双路直流无刷电机矢量控制器-使用文档

  6. BF算法和KMP算法

    给定两个字符串S和T,在主串S中查找子串T的过程称为串匹配(string matching,也称模式匹配),T称为模式.这里将介绍处理串匹配问题的两种算法,BF算法和KMP算法. BF算法 (暴力匹配 ...

  7. Oracle 20c 新特性:XGBoost 机器学习算法和 AutoML 的支持

    墨墨导读:XGBoost是一个高效.可扩展的机器学习算法,用于回归和分类(regression and classification),使得XGBoost Gradient Boosting开源包可用 ...

  8. 使用Apriori算法和FP-growth算法进行关联分析

    目录 1. 关联分析 2. Apriori原理 3. 使用Apriori算法来发现频繁集 4. 使用FP-growth算法来高效发现频繁项集 5. 示例:从新闻网站点击流中挖掘新闻报道 扩展阅读 系列 ...

  9. Dijkstra算法和Floyd算法超详解以及区别

    鉴于之前我看到过非常好的博客,如果自己总结的话,大多也是按照别的博主的思路来解释,所以就直接推荐给大家这些优秀的博客: Dijkstra:最短路径dijkstra算法精品代码(超详解) Floyd:F ...

最新文章

  1. 新浪微博授权失败:applications over the unaudited use restrictions
  2. 转载:sqlmap的应用实战
  3. 服务器3个w目录文件夹,第 4 章 目录服务器条目 (Sun Java System Directory Server Enterprise Edition 6.2 管理指南)...
  4. 快递鸟电子面单打印功能基于java
  5. matlab幂法的瑞利商加速,瑞利商加速定理14.PPT
  6. Youtube深度学习推荐系统
  7. 从Oracle数据库故障到AIX内存管理
  8. jni直接转byte_JNI jbyteArray转char*
  9. 在redis上实现分布式锁
  10. 运动目标跟踪(十三)--SRDCF/DeepSRDCF
  11. 算法(第四版) 2.1答案
  12. linux安装程序时Cannot uninstall XXX. It is a distutils installed project and thus we cannot accurately
  13. c r 语言教程,R语言初级教程
  14. 【论文学习】基于区块链的档案数据保护和共享方法
  15. CANopen协议解读
  16. Meta-Q-Learning
  17. 举个栗子~Tableau 技巧(211):学做指针环形图
  18. 一文搞懂华为ML Kit数字人,超简单集成
  19. 高血压患者的饮食宜忌等
  20. 正向代理和反向代理快速理解

热门文章

  1. 快手Scheme全网最全配合AutoJs使用
  2. 初中毕业打工妹出奇招【宝宝洗澡按摩店】
  3. js时间转换,国际时间
  4. 【转】Java面试资源----百度Java面试题前200页大汇总
  5. pppoe协议交互流程以及报文结构
  6. 视频剪辑,教你最简单的方法转换视频格式
  7. 无软著个人开发者(学生)安卓应用上架流程总结
  8. 求水的容积(锐明科技)
  9. 外贸邮件群发的技巧:外贸客户邮箱搜集方法大全
  10. 用html做成的音频播放器,使用HTML5的Audio标签打造WEB音频播放器