一文搞懂链表相关算法

目录

链表的逆序和截断

逆序

截断

查找链表的中间节点

力扣题


博主主页:东洛的克莱斯韦克-CSDN博客

链表的逆序和截断

逆序

        推荐使用头插法逆序,首先要 new 一个虚拟头节点——newNode。如下图

        链表的头节点为head,由cur指针指向head,逆序算法如下:

        1. next = cur->next;

        2.cur->next = newNode->next;

        3.newNode->next = cur;

        4.cur = next;

        为了防止cur找不到下一个节点,要提前用next保存起来,cur遍历到的节点都会放到newNode的后面,当cur遍历完整个链表后,newNode后面就是逆序后的链表。

        该算法的结束条件是:

        cur == nullptr;

        时间复杂度为 O(N) , 空间复杂度为 O(1) 。

截断

        在上述算法的基础上我们给newNode一个指针newNode_cur ,如下图

        把head链表上的节点插入到newNode_curnewNode_cur指针向后移动一格。

        1.next = cur->next;

        2.cur->next = newNode_cur->next;

        3.newNode_cur->next = cur;

        4.cur = next;

        5.newNode_cur = newNode_cur->next;

         为了防止cur找不到下一个节点,依旧让next记录cur的下一个节点的位置。这次newNode后面是顺序的链表。

        结束条件取决于要截断多少节点,如果结束条件是

        cur == nullptr 

        那么上述截断算法等价于下述代码

        newNode->next = head;

        相当于把head链表连入newNode链表的后面。

查找链表的中间节点

        用快慢双指针算法。慢指针 slow 每次移动一个节点,快指针 fast 每次移动两个节点,slowfast 都初始化(指向)为链表的头节点, 算法如下

        while (fast && fast->next) {

                slow = slow->next;

                fast = fast->next->next;

        }

结果如下图示意

       1. 当 fast 为空时,链表为偶数,slow指针会落在中间靠右的节点上

       2. 当 fast->next 为空时,链表为基数,slow指针会落在中间的节点上

力扣题

LCR 026. 重排链表 - 力扣(LeetCode)

        这道题比较综合,大题思路就是先找中间节点,再把后半部分链表逆序,然后把逆序后的链表重排到前半部分的链表中。

class Solution {
public:void reorderList(ListNode* head) {//边界情况if (head == nullptr || head->next == nullptr || head->next->next == nullptr) return;//找中间节点ListNode* left = head, *right = head;while (right && right->next) {left = left->next;right = right->next->next;}//把 left 后面的节点逆序ListNode* head1 = new ListNode();ListNode* cur = left->next; left->next = nullptr;while (cur) {ListNode* next = cur->next;cur->next = head1->next;head1->next = cur;cur = next;}//链表重排ListNode* ret = new ListNode();cur = ret;ListNode* head2 = head1->next;while (head) {ListNode* next = head->next;head->next = cur->next;cur->next = head;head = next;cur = cur->next;if (head2) {ListNode* next1 = head2->next;head2->next = cur->next;cur->next = head2;head2 = next1;cur = cur->next;}}//更新结果,释放虚拟节点head = ret->next;delete ret;delete head1;}
};

LCR 078. 合并 K 个升序链表 - 力扣(LeetCode)

        如果用暴力解法的话时间复杂度会非常高,可以考虑用优先级队列做优化

class Solution {class cmp {public:bool operator()(const ListNode* l1, const ListNode* l2) { return l1->val > l2->val; }};public:ListNode* mergeKLists(vector<ListNode*>& lists) {//小跟堆priority_queue<ListNode*, vector<ListNode*>, cmp> heap;ListNode* ret = new ListNode();ListNode* cur = ret;//把链表的头结点放入优先级队列for(auto l : lists) { if (l) heap.push(l); }while (!(heap.empty())) {ListNode* t = heap.top();ListNode* next = t->next;   //记录链表的下一个节点t->next = cur->next;        //插入到ret的后面cur->next = t;              //插入到ret的后面cur = cur->next;heap.pop();if(next) heap.push(next);}cur = ret->next;delete ret;return cur;}
};

其他一些链表题

25. K 个一组翻转链表 - 力扣(LeetCode)

160. 相交链表 - 力扣(LeetCode)

141. 环形链表 - 力扣(LeetCode)

138. 随机链表的复制 - 力扣(LeetCode)

138这道题很考验对链表的把控

LCR 077. 排序链表 - 力扣(LeetCode)

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

红外热成像技术开启光伏检测新视界

随着全球对可再生能源需求的不断增加&#xff0c;光伏发电系统的应用日益广泛。然而&#xff0c;光伏组件在长期运行中可能会出现各种故障&#xff0c;如热斑效应、隐裂、接线盒故障等&#xff0c;这些问题不仅影响光伏系统的发电效率&#xff0c;还可能引发安全隐患。 红外热成…

基于vue框架的的社区智慧养老系统1mo30(程序+源码+数据库+调试部署+开发环境)

系统程序文件列表 项目功能&#xff1a;老人,员工,老人档案,养生视频,社区医生,就医信息,在线咨询,咨询回复,菜品信息,点餐订单,服务预约,通知信息,服务评价,健康关爱,新闻公告,监控日志 开题报告内容 以下是一份基于Vue框架的社区智慧养老系统的开题报告&#xff0c;详细阐述…

龙蜥8.6 配置用户登录次数和锁定策略(已亲测)

操作系统&#xff1a;龙蜥8.6 x86_64 查看是否安装pam模块 rpm -qa | grep pam 查看可以使用的认证模块&#xff0c;因为有的系统是pam_tally2. cd /etc/pam.d ls 经过查看&#xff0c;该服务器是使用的pam_faillock 模块 打开/etc/pam.d/password-auth 的 PAM 配置文件…

【6.4】位运算-判断是否存在重复元素

一、题目 给定一个整数数组&#xff0c;判断 是否存在重复元素 。如果存在一值在数组中 出现至少两次 &#xff0c;函数返回 true 。如果数组中每个元素都不相同&#xff0c;则返回 false 。 示例 1: 输入: [ 1 , 2 , 3 , 1 ] 输出: true 示例 2: 输入: [ 1 , 2 , 3 , 4 ] 输出…

PCB打样下单流程

PCB打样下单流程 一、PCB打样在线下单流程1&#xff0e;平台登录2&#xff0e;PCB打样领券3&#xff0e;进入下单系统4&#xff0e;上传PCB文件5&#xff0e;PCB订单界面 PCB&#xff08;印刷电路板&#xff09;打样是验证设计、优化性能和推进项目进度的关键环节。随着互联网的…

Python爬虫知识体系-----正则表达式-----持续更新

数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新&#xff1a;https://blog.csdn.net/grd_java/article/details/140574349 文章目录 一、正则基础1. 为什么使用正则2. 正则与re模块简介 二、正则表达式1. 匹配单个字符与数字2. 限定符3. 定位符4. 选择匹…

yolo标签自动标注(使用python和yolo方法)

yolo代码自动标注 1.引言1.初阶“自动标注”&#xff0c;给每个图像都生成一个固定的标注文件&#xff0c;进而在labglimg中对矩形框进行微调&#xff0c;减少标注的工作量2.高阶自动标注&#xff0c;利用我们训练好的&#xff08;但是没有特别精准的&#xff09;yolo文件先对每…

在 WPF 中,如何使用命令来替代事件处理?

在 WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;命令是一种非常强大的替代传统事件处理的方法&#xff0c;特别适用于 MVVM&#xff08;Model-View-ViewModel&#xff09;架构。命令可以实现界面&#xff08;View&#xff09;和逻辑&#xff08;…

语音 AI 革命:未来,消费者更可能倾向于与 AI 沟通,而非人工客服

「未来&#xff0c;消费者更可能倾向于与 AI 沟通&#xff0c;而非人工客服&#xff0c;因为这将成为解决问题的最高效途径。」 这篇来自 Bessemer Venture Partners 的报告&#xff0c;是目前为止对语音 AI 在企业应用上最完整清晰的一次梳理。 核心要点&#xff1a; 尽管市…

过去几年电子学习的趋势

近年来&#xff0c;在技术和不断变化的学习者期望的推动下&#xff0c;电子学习已经发展成为一种适应性强、沉浸式和社会化的教育形式。个性化已成为最具影响力的趋势之一&#xff0c;Coursera和LinkedIn Learning等平台为个人量身定制内容。这些平台使用人工智能来建议课程、跟…

Java基础-Java多线程机制

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一、引言 二、多线程的基本概念 1. 线程与进程 2. 多线程与并发 3. 多线程的优势 三、Java多线程的实…

springboot 之 整合springdoc2.6 (swagger 3)

版本 springboot 3.3.5 jdk 17 springdoc 2.6.0 依赖pom <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.6.0</version> </dependency>注解对比…

Zabbix部署

1.集群规划 进程虚拟机节点1虚拟机节点2虚拟机节点3zabbix-agent√√√zabbix-server√PostgreSQL√zabbix-web√ 2.准备工作 默认在虚拟机节点2安装kafka、在虚拟机节点3安装redis 2.1关闭3台节点防火墙 sudo systemctl stop firewalld.service sudo systemctl disable fi…

如何优化锚文本来提升关键词排名?

锚文本在SEO中是个小细节&#xff0c;但作用可不小。它不仅能影响外链的质量&#xff0c;还直接影响你的目标关键词排名。你要知道&#xff0c;锚文本并不是随便加上就行&#xff0c;它得讲究技巧和策略。 锚文本的关键词选择一定要精准&#xff0c;且与页面内容高度相关。比如…

java项目-jenkins任务的创建和执行

参考内容: jenkins的安装部署以及全局配置 1.编译任务的general 2.源码管理 3.构建里编译打包然后copy复制jar包到运行服务器的路径 4.部署任务&#xff0c;执行部署脚本

怎么能够制作活码的二维码?在线生成活码的简单技巧

活码是现在很常用的一种二维码类型&#xff0c;可以用来展示日常生活中的视频、音频、图片、文件等多种类型的内容&#xff0c;有效提高内容分享的效率&#xff0c;可以让更多人同时扫码获取内容。使用二维码来展示内容&#xff0c;用户也不需要下载或者保存内容&#xff0c;扫…

谷歌SEO为什么是一场持久战?

很多人在刚开始做SEO时&#xff0c;都会满怀期待&#xff0c;希望能在短时间内看到显著的效果。但很快&#xff0c;他们就会发现&#xff0c;这是一场需要耐心的持久战。谷歌的算法非常复杂&#xff0c;每天都在调整优化&#xff0c;你今天做的改动&#xff0c;可能要几个月后才…

6TS Series TVS 的 解析

6TS Series 600W Transient Voltage Suppresso指的是一系列高性能的瞬态电压抑制二极管&#xff08;Transient Voltage Suppressor&#xff0c;TVS&#xff09;&#xff0c;这些二极管由时源芯微科技&#xff08;TimeSource&#xff09;设计用于保护敏感的电子设备免受雷击、电…

AI绘图最强软件stable diffusion,一文带你迅速了解!

有需要stable diffusion整合包可以扫描下方&#xff0c;免费获取 01 — 什么是 SD ​ Stable Difusion(简称 SD) 其三种概念。 1.用来指代稳定扩散(Stable Diffusion) 技术,如 Midjourney是基于Stable Difusion技术实现的就是指它运用了 Stable Diffusion 的技术原理。 …

Leecode热题100-35.搜索插入位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入:…