重新排列链表

        不难注意到目标链表即为将原链表分成前后两段然后将后半段反转再依照某种规则链接得到的。这样我们的任务即可划分为三步:找到原链表的中点,将原链表的右半端反转,将原链表的两端合并。可以通过快慢指针找到中点不过要注意链表长度分别为奇偶情况的处理,反转可以通过迭代或者递归的方法。

    public void reorderList(ListNode head) {// 创建一个虚拟节点,使得链表可以从头开始ListNode dummy = new ListNode(0);dummy.next = head;// 使用快慢指针找到链表的中点,将链表分为两部分ListNode fast = dummy;ListNode slow = dummy;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next;// 链表长度是奇数这样处理使前半段比后半段多一个节点if (fast.next != null) {fast = fast.next;}}// 将链表分为两部分后,对后半部分进行反转ListNode temp = slow.next;slow.next = null;// 调用 link 方法连接前半部分和反转后的后半部分链表link(head, reverseList(temp), dummy);}/*** 作用:连接两个链表* @param node1 前半段头节点* @param node2 后半段头节点* @param head 新链表的头节点,即dummy节点*/private void link(ListNode node1, ListNode node2, ListNode head) {ListNode prev = head;while (node1 != null && node2 != null) {ListNode temp = node1.next;// 将前半部分链表的当前节点指向后半部分链表的当前节点prev.next = node1;node1.next = node2;// 更新 prev 指向后半部分链表的当前节点prev = node2;// 同时移动两个链表的指针node1 = temp;node2 = node2.next;}// 如果前半部分链表还有剩余节点(链表长度是奇数),连接到后半部分链表的末尾if (node1 != null) {prev.next = node1;}}// 反转链表public ListNode reverseList(ListNode head) {ListNode prev = null;ListNode cur = head;while (cur != null) {ListNode next = cur.next;cur.next = prev;prev = cur;cur = next;}return prev;}

        另一种相较于这个方法没那么优雅的方法是我们可以使用线性表。因为链表不支持下标访问,所以我们无法随机访问链表中任意位置的元素。因此我们可以利用线性表存储该链表,然后利用线性表可以下标访问的特点,直接按顺序访问指定元素,重建该链表即可。

    public void reorderList(ListNode head) {// 如果链表为空,则直接返回,不需要重新排列if (head == null) {return;}// 创建一个 ArrayList 用于存储链表的所有节点List<ListNode> list = new ArrayList<ListNode>();ListNode node = head;// 将链表中的每个节点依次添加到 ArrayList 中while (node != null) {list.add(node);node = node.next;}// 使用双指针 i 和 j 分别指向数组的开头和结尾int i = 0, j = list.size() - 1;// 在循环中,将指针 i 对应的节点的 next 指向指针 j 对应的节点,// 同时将指针 j 对应的节点的 next 指向指针 i 对应的节点。while (i < j) {list.get(i).next = list.get(j);i++;// 如果 i 和 j 相遇,说明链表已经重新排列完成,跳出循环if (i == j) {break;}list.get(j).next = list.get(i);j--;}// 将最后一个节点的 next 设置为 null,以确保链表的结束list.get(i).next = null;}

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

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

相关文章

算法学习——LeetCode力扣哈希表篇1

算法学习——LeetCode力扣哈希表篇1 242. 有效的字母异位词 242. 有效的字母异位词 - 力扣&#xff08;LeetCode&#xff09; 描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同…

Python学习从0到1 day15 Python函数进阶

什么东西的可塑性最强呢&#xff1f; 是水&#xff0c;水能载舟 exciting ——24.2.6 一、函数的多返回值 当一个函数需要多个返回值&#xff0c;该如何书写代码&#xff1f; 按照返回值的顺序&#xff0c;写对应顺序的多个遍历接收即可 变量之间用逗号隔开 支持不同类型的数据…

爬虫(三)

1.JS逆向实战破解X-Bogus值 X-Bogus:以DFS开头&#xff0c;总长28位 答案是X-Bogus,因为会把负载里面所有的值打包生成X-Boogus 1.1 找X-Bogus加密位置&#xff08;请求堆栈&#xff09; 1.1.1 绝招加高级断点&#xff08;日志断点&#xff09; 日志断点看有没有X-B值 日志…

【算法分析与设计】无重复的最长子串

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 示例 1: 输入: s "abcabcbb" 输…

java中String类常用API

前言&#xff1a;在学习java的String类的时候&#xff0c;有很多的API需要了解&#xff0c;下面我将举出其中在新手学习时使用频率较大的几个API。 先大体看一下有哪几个&#xff1a;&#xff08;如图&#xff09; 目录 1.equals&#xff08;&#xff09;和 equalsIgnoreCase&…

maven依赖报错处理(或者maven怎么刷新都下载不了依赖)

maven依赖报错&#xff0c;或者不报错&#xff0c;但是怎么刷新maven都没反应&#xff0c;可以试一下以下操作 当下载jar的时候&#xff0c;如果断网&#xff0c;或者连接超时的时候&#xff0c;会自动在文件夹中创建一个名为*lastupdate的文件&#xff0c;当有了这个文件之后…

【C语言】贪吃蛇 详解

该项目需要的技术要点 C语言函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32API等。 由于篇幅限制 和 使知识模块化&#xff0c; 若想了解 使用到的 Win32API 的知识&#xff1a;请点击跳转&#xff1a;【Win32API】贪吃蛇会使用到的 Win32API 目录 1. 贪吃蛇游…

ISIS 特性验证(ATT置位、渗透、认证)

拓扑图 配置 sysname AR1 # isis 1is-level level-1cost-style widenetwork-entity 49.0001.0000.0000.0001.00 # interface GigabitEthernet0/0/0ip address 12.1.1.1 255.255.255.0 isis enable 1 # interface GigabitEthernet0/0/1ip address 13.1.1.1 255.255.255.0 isis e…

echarts:一个复杂的瀑布图制作

文章目录 成品展示思路介绍1、如何让柱子不是从0开始2、左侧y轴的时间怎么表示3、柱子上的线怎么画出来 做出两个简单柱子下面加上透明柱子合并两个柱子y轴左右各一个坐标轴y轴固定间隔刻度y轴刻度数值转换y轴显示标签添加图例对折线图的点样式进行设置显示点上的数字并对数字做…

【Java基础】关于Java基础的一些有趣的常识!

前言 今天看到了一篇文章&#xff0c;是关于茶余饭后的Java常识的一些有趣解答&#xff0c;我觉得写的很有趣很易懂&#xff0c;所以截取了其中我觉得比较有趣的问题分享给大家。原文&#xff1a;饭后茶余的java常识 - 知乎 (zhihu.com) 1. Java语言的特点有哪些&#xff1f; …

如何利用HubSpot进行个性化营销?

利用HubSpot进行个性化营销可以通过以下步骤实现&#xff1a; 收集客户数据&#xff1a;利用HubSpot的CRM功能&#xff0c;收集客户的基本信息、行为数据和偏好等信息。这些数据可以包括客户的姓名、电子邮件地址、所在行业、购买历史、网站浏览记录等。 建立客户画像&#x…

【机器学习】基于集成学习的 Amazon 用户评论质量预测

实验六: 基于集成学习的 Amazon 用户评论质量预测 1 案例简介 ​ 随着电商平台的兴起&#xff0c;以及疫情的持续影响&#xff0c;线上购物在我们的日常生活中扮演着越来越重要的角色。在进行线上商品挑选时&#xff0c;评论往往是我们十分关注的一个方面。然而目前电商网站的…