Java【手撕链表】LeetCode 143. “重排链表“, 图文详解思路分析 + 代码

文章目录

  • 前言
  • 一、两数相加
    • 1, 题目
    • 2, 思路分析
      • 2,1 找到中间结点
      • 2.2, 逆序后半段链表
      • 2.3, 合并两个链表
    • 3, 代码


前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)


对于链表题, 常用的技巧和操作是: 头插, 尾插, 快慢双指针, 傀儡节点

一、两数相加

1, 题目

OJ链接

题目规定不能改变链表里的值, 而是真正交换链表节点


2, 思路分析

首先, 按照题意画出重排之后的链表, 观察原链表和重排之后的链表有什么变化
在这里插入图片描述
只看橙色结点, 发现后半段链表是逆序

至此 本题的思路就非常清晰了

  • 1, 找到中间节点(快慢双指针)
  • 2, 逆序后半段链表(傀儡头节点 + 头插)
  • 3, 合并两个链表(傀儡头结点 + 双指针)

注意本题没有返回值, 所以第三步操作之后不是返回新的头结点, 而是要修改原链表的头结点 head 之后的结点的指向

2,1 找到中间结点

  • 1, 定义 slow 和 fast 两个指针, 起始位置都指向头结点
  • 2, slow 每次走一步, fast 每次走两步
  • 3, 当 fast 为 null 或 fast.next 为 null 时退出循环
    在这里插入图片描述

如果有奇数个结点, slow 刚好是中间结点, 如果是偶数个结点, slow 是偏右的中间节点


2.2, 逆序后半段链表

  • 1, 定义一个傀儡节点 pHead
  • 2, 定义一个 target 指针, target 就指向刚才的 slow
  • 3, 定义一个 next 指针, 记录 target 的下一个结点
  • 4, 循环遍历后半段链表, 依次头插到 pHead 所在的链表

在这里插入图片描述

**加粗样式**
在这里插入图片描述
此时 target 为 null, 逆序完成, 退出循环

这里有个 bug ! 在循环逆序链表之前应该先断开原链表的前半段和后半段
否则逆序完成之后, 原链表并没有断开, 再执行第三步 (合并两个链表) 时就会发生死循环!
在这里插入图片描述
所以在第一步时应该定义一个 prev 指针, 记录 slow 结点的前一个结点, 找到中间结点后, 令 prev.next = null


2.3, 合并两个链表

  • 1, 定义一个傀儡节点 ret
  • 2, 定义一个 cur1 指针, 指向原链表头结点 head
  • 3, 定义一个 cur2 指针, 指向逆序后的链表的头结点
  • 4, 定义一个 cur3 指针, 指向 ret

1, cur1 尾插到 cur3 后面
在这里插入图片描述

(此时 1 这个结点还指向 2 ), cur2 尾插到 cur3 后面

在这里插入图片描述


2, (此时 6 这个结点还指向 5 ), cur1 尾插到 cur3 后面,

在这里插入图片描述

(此时 2 这个结点还指向 3 ), cur2 尾插到 cur3 后面

在这里插入图片描述


3, (此时 5 这个结点还指向 4 ), cur1 尾插到 cur3 后面
在这里插入图片描述

cur2 尾插到 cur3 后面
在这里插入图片描述


4, 得到整个链表, 此时 head 结点还在, 并且 head 之后的结点链表结构已经被修改成功
在这里插入图片描述

在一次循环中, 先尾插 cur1, 再尾插 cur2, 循环条件设为 cur1 != null 即可

因为 : 如果链表是偶数个结点, 链表前半段和后半段长度相同, 如果链表是奇数个结点, 链表前半段比后半段少一个结点, 但没关系, 尾插时不会改变结点的的 next 域


3, 代码

	public void reorderList(ListNode head) {if(head == null || head.next == null) {return;}// 1, 找到中间节点ListNode slow = head;ListNode fast = slow;ListNode prev = head;while(fast != null && fast.next != null) {prev = slow;slow = slow.next;fast = fast.next.next;}ListNode target = slow;prev.next = null;ListNode phead = new ListNode(0);ListNode cur = phead;// 2, 逆序后半个链表while(target != null) {ListNode next = target.next;target.next = cur.next;cur.next = target;target = next;}ListNode cur1 = head;ListNode cur2 = phead.next;ListNode ret = new ListNode(0);ListNode cur3 = ret;// 3, 合并链表while(cur1 != null){cur3.next = cur1;cur3 = cur3.next;cur1 = cur1.next;cur3.next = cur2;cur3 = cur3.next;cur2 = cur2.next;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/120944.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TouchGFX之字体缓存

使用二进制字体需要将整个字体加载到存储器。 在某些情况下,如果字体很大,如大字号中文字体,则这样做可能不可取。 字体缓存使应用能够从外部存储器只能加载显示字符串所需的字母。 这意味着整个字体无需保存到在可寻址闪存或RAM上&#xff…

docker安装apisix全教程包含windows和linux

docker安装apisix 一、Windows安装1、首先需要安装docker和docker compose,如果直接安装docker desktop,会自动安装docker compose。2、重新启动电脑3、访问 Docker 的下载([https://www.docker.com/products/docker-desktop](https://www.do…

【Git】Deepin提示git remote: HTTP Basic: Access denied 错误解决办法

git remote: HTTP Basic: Access denied 错误解决办法 1.提交代码的时候提示2. 原因3.解决方案 1.提交代码的时候提示 git remote: HTTP Basic: Access denied 错误解决办法 2. 原因 本地git配置的用户名、密码与gitlabs上注册的用户名、密码不一致。 3.解决方案 如果账号…

12款爆款项目管理工具推荐

项目管理需要用到的工具有哪些?从操作难易程度、功能是否涵盖项目需求、价格等方面入手推荐Zoho Projects、Redmine、Teambition、Microsoft Project、Omniplan、Podio、Freedcamp、Teamweek、Gantt Project、Basecamp、Meister Task、Teamwork等12款项目管理工具。…

Flink on yarn 实战和源码分析

版本:1.13.6 目录 Flink on yarn 的3种模式的使用 yarn session 模式源码分析 yarn per-job模式源码分析 application模式源码分析 Flink on yarn 的3种模式的使用 Application Mode # ./bin/flink run-application -t yarn-application ./examples/streaming…

Elasticsearch:使用 Elasticsearch 进行语义搜索

在数字时代,搜索引擎在通过浏览互联网上的大量可用信息来检索数据方面发挥着重要作用。 此方法涉及用户在搜索栏中输入特定术语或短语,期望搜索引擎返回与这些确切关键字匹配的结果。 虽然关键字搜索对于简化信息检索非常有价值,但它也有其局…

22 mysql range 查询

前言 这里主要是 探究一下 explain $sql 中各个 type 诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 以及 相关的差异 此系列文章建议从 mysql const 查询 开始看 测试表结构…

跟着Nature Plant学图形颜色搭配 | caecopal包

写在前面 今天在Nature Plant(IF:16.0)期刊中看到文中的图形,进一步的查看后发现作者使用一个R包来进行图形颜色的搭配。就此机会也分享给大家,若你需要可以进一步查看及使用此包。 对于图形颜色的搭配,对于文章整体美观是非常重要。但是&a…

Docker介绍与安装

目录 一、Docker 概述 1、什么时Docker 2、Docker的设计宗旨 4、Docker的优点 5、Docker容器和虚拟机的区别 6、 namespace的隔离(命名空间) 7、 Docker的三个核心概念 7.1 镜像 7.2 容器 7.3 仓库(Docker Hapu) 二、D…

Unity中Shader通道ColorMask

文章目录 [TOC](文章目录) 前言一、ColorMask是用来干什么的二、怎么做到和 Unity UI 中的 Shader 一样根据UI层级自动适配Shader中模板测试值1、借鉴Unity官方的 UI Shader 前言 Unity中Shader通道ColorMask 一、ColorMask是用来干什么的 ColorMask RGB | A | 0 | R、G、B、…

c语言练习70:反转两次的数字

反转两次的数字 题⽬描述: 反转 ⼀个整数意味着倒置它的所有位。 例如,反转 2021 得到 1202 。反转 12300 得到 321 ,不保留前导零 。 给你⼀个整数 num ,反转 num 得到 reversed1 ,接着反转 reversed1 得到 revers…

Android AMS——APP启动流程(三)

Android 应用启动方式主要有两种 , 冷启动和热启动。 冷启动:后台没有应用进程 , 需要先创建进程 , 然后启动 Activity ;热启动:后台有应用进程 , 不创建进程 , 直接启动 Activity ; 其实,还有一种温起动的方式,就是用户按了返回键退出应用,随后又从新启动,可是活…