[算法]——链表(三)

[算法]——链表(三)

目录

​编辑

一、前言

二、正文

1.重排链表

1.1 题目解析

1.2 算法原理

1.3 具体代码

2.K个一组翻转链表

2.1 题目解析

2.2 算法原理

2.3 具体代码

三、结语


一、前言

        本文将继续为大家带来链表的学习!!!

二、正文

1.重排链表

1. 重排链表 - [力扣]

1.1 题目解析

        本题要求要求我们对所给链表进行重排,那么观察题目所给示例,我们会发现所谓重排后的链表,就是先头结点,尾结点,然后头结点的下一个节点,尾结点的前一个节点……y依次类推,直至链表所有的元素都被插入。

1.2 算法原理

         那么本题的原理依旧是模拟的思路,那么该如何模拟呢?

具体的步骤如下:

1.找到链表的中间节点——利用快慢双指针

2.根据快慢双指针将链表分为两部分,对slow指针后面的部分进行逆序(使用头插法),其目的是为了该部分插入的顺序与我们模拟的插入相同

3.合并两个链表——利用双指针

1.3 具体代码

/** * 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: void reorderList(ListNode* head) { if(head->next==nullptr) return ; ListNode* ret=new ListNode; ListNode* back=new ListNode; //找到链表中的中间节点 ListNode *slow=head,*fast=head->next; while(fast->next && fast->next->next) { slow=slow->next; fast=fast->next->next; } //head-slow(前) slow->next-tail(后) //对后面的链表进行逆序 ListNode *cur=slow->next; while(cur) { ListNode* next=cur->next; if(back->next==nullptr) { back->next=cur; cur->next=nullptr; //不处理会导致死循环 } else { cur->next=back->next; back->next=cur; } cur=next; } //合并两个链表 slow->next=nullptr; ListNode *cur1=head,*cur2=back->next,*cur3=ret; while(cur1 && cur2) { cur3->next=cur1; cur1=cur1->next;//二三行不能颠倒, cur3=cur3->next; cur3->next=cur2; cur2=cur2->next; cur3=cur3->next; } while(cur2) { cur3->next=cur2; cur2=cur2->next; } head=ret->next; } };

2.K个一组翻转链表

2.1 题目解析

        本题与我们之前讲过的一题类似,不知道小伙伴们还记不记得“两两交换链表中的节点”那道题,那道题要求我们对来链表中的两两节点进行交换,而本题则是提升了一点难度,交换的节点个数为k个,对于不足k个节点则不用进行交换

2.2 算法原理

        本题的算法思路依旧是模拟,即模拟题目交换节点的过程

具体步骤如下:

1.求出需要逆序的组数n

2.重复n次:长度为k的链表逆序

3.把不需要翻转的链表接在最后一次翻转的节点之后




注:这里要注意的一点在每次逆序结束之后,我们都要将prev节点重新调整位置至下一次要逆序的第一个节点的前一个,即我们本次逆序链表的首个插入节点

2.3 具体代码

/** * 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* reverseKGroup(ListNode* head, int k) { //1.求出需要逆序的组数 ListNode* cur = head; int n = 0; while (cur) { n++; cur = cur->next; } n/=k; //2.重复n次:长度为k的链表逆序 ListNode* newhead = new ListNode(0); ListNode* prev = newhead; cur = head; for(int i=0;i < n;++i) { ListNode* tmp=cur; for(int j=0;j<k;j++) { ListNode* next = cur->next; cur->next = prev->next; prev->next = cur; cur = next; } prev=tmp; } //把不需要翻转的接上 prev->next = cur; return newhead->next; } };

三、结语

         到此为止,本文关于链表(三)内容到此结束了,如有不足之处,欢迎小伙伴们指出呀!

         关注我 _麦麦_分享更多干货:_麦麦_-ZEEKLOG博客

         大家的「关注❤️ + 点赞👍 + 收藏⭐」就是我创作的最大动力!谢谢大家的支持,我们下期见!

        欢迎大家参观我的算法专栏:

麦麦的算法专栏https://blog.ZEEKLOG.net/m0_73953114/category_12866812.html

Read more

Spring Boot 数据缓存与性能优化

Spring Boot 数据缓存与性能优化

Spring Boot 数据缓存与性能优化 23.1 学习目标与重点提示 学习目标:掌握Spring Boot数据缓存与性能优化的核心概念与使用方法,包括数据缓存的定义与特点、Spring Boot与数据缓存的集成、Spring Boot与数据缓存的配置、Spring Boot与数据缓存的基本方法、Spring Boot的实际应用场景,学会在实际开发中处理数据缓存与性能优化问题。 重点:数据缓存的定义与特点、Spring Boot与数据缓存的集成、Spring Boot与数据缓存的配置、Spring Boot与数据缓存的基本方法、Spring Boot的实际应用场景。 23.2 数据缓存概述 数据缓存是Java开发中的重要组件。 23.2.1 数据缓存的定义 定义:数据缓存是一种存储机制,用于将常用数据存储在高速存储设备中,以便快速访问。 作用: * 提高应用程序的性能。 * 减少数据库的访问次数。 * 提高用户体验。 常见的数据缓存: * EhCache:Apache EhCache是一款开源的缓存库。 * Caffeine:

By Ne0inhk

10秒上手中文语音识别,科哥构建的WebUI太友好了

10秒上手中文语音识别,科哥构建的WebUI太友好了 你有没有过这样的时刻:会议刚结束,录音文件堆在文件夹里发呆;采访素材躺在硬盘里吃灰;想把一段语音快速转成文字,却卡在环境配置、模型下载、代码调试的迷宫里?别折腾了——今天这个工具,真能让你10秒打开网页、30秒上传音频、1分钟拿到准确文字稿。 这不是概念演示,也不是简化版demo,而是基于阿里FunASR生态中性能顶尖的Speech Seaco Paraformer ASR模型,由开发者“科哥”亲手封装、反复打磨的WebUI镜像。它不依赖Python环境、不碰CUDA编译、不写一行代码,所有操作都在浏览器里完成。更关键的是:它专为中文场景优化,对“人工智能”“大模型”“端到端”这类高频术语识别稳得一批,还支持热词定制——这才是真正能进工作流的语音识别工具。 下面我就带你从零开始,不讲原理、不列参数、不堆术语,只说你点哪里、传什么、看什么、怎么用得更准。 1. 三步启动:不用装、不用配、

By Ne0inhk
【Java Web学习 | 第五篇】CSS(4) -盒子模型

【Java Web学习 | 第五篇】CSS(4) -盒子模型

🌈个人主页: Hygge_Code🔥热门专栏:从0开始学习Java | Linux学习| 计算机网络💫个人格言: “既然选择了远方,便不顾风雨兼程” 文章目录 * CSS盒子模型🥝 * 1. 什么是CSS盒子模型? * 2. 边框(border):盒子的"外衣"🍋‍🟩 * 边框的基本属性 * 单边边框设置 * 边框对盒子大小的影响 * 表格细线边框 * 3. 内边距(padding):内容与边框的缓冲带🍋‍🟩 * 内边距的基本用法 * 内边距对盒子大小的影响 * 内边距的实用技巧 * 内边距不影响盒子大小的特殊情况 * 4. 外边距(margin):盒子之间的距离🍋‍🟩 * 外边距的基本用法 * 外边距的典型应用:水平居中 * 外边距合并问题 * 清除默认内外边距🐦‍🔥 * 综合代码演示 * CSS美化三剑客:圆角边框、盒子阴影与文字阴影🥝 * 1. 圆角边框(border-radius):告别生

By Ne0inhk