【数据结构和算法】删除链表的中间节点

其他系列文章导航

Java基础合集
数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

其他系列文章导航

文章目录

前言

一、题目描述

二、题解

三、代码

四、复杂度分析


前言

这是力扣的 2095 题,难度为中等,解题方案有很多种,本文讲解我认为最奇妙的一种。

慢慢开始链表的模块了,这道题是一道非常好的队列的例题,很有代表性。


一、题目描述

给你一个链表的头节点 head 。删除 链表的 中间节点 ,并返回修改后的链表的头节点 head 。

长度为 n 链表的中间节点是从头数起第 ⌊n / 2⌋ 个节点(下标从 0 开始),其中 ⌊x⌋ 表示小于或等于 x 的最大整数。

  • 对于 n = 1234 和 5 的情况,中间节点的下标分别是 0112 和 2 。

示例 1:

输入:head = [1,3,4,7,1,2,6]
输出:[1,3,4,1,2,6]
解释:
上图表示给出的链表。节点的下标分别标注在每个节点的下方。
由于 n = 7 ,值为 7 的节点 3 是中间节点,用红色标注。
返回结果为移除节点后的新链表。 

示例 2:

输入:head = [1,2,3,4]
输出:[1,2,4]
解释:
上图表示给出的链表。
对于 n = 4 ,值为 3 的节点 2 是中间节点,用红色标注。

示例 3:

输入:head = [2,1]
输出:[2]
解释:
上图表示给出的链表。
对于 n = 2 ,值为 1 的节点 1 是中间节点,用红色标注。
值为 2 的节点 0 是移除节点 1 后剩下的唯一一个节点。

提示:

  • 链表中节点的数目在范围 [1, 105] 内
  • 1 <= Node.val <= 105

二、题解

2.1 方法一:快慢指针法

这个算法的目的是从链表中删除中间的节点,而保持链表的其余部分不变。给定链表的头结点 head,该方法返回删除中间节点后的链表。

思路与算法:

  1. 基本情况: 如果链表只有一个节点或者没有节点,直接返回 null
  2. 双指针法: 使用两个指针,一个快速指针 fast 和一个慢指针 slow。开始时,fast 和 slow 都指向链表的头部。
  3. 移动指针: 当 fast 指针移动到倒数第二个节点时(即当前节点是中间节点的前一个节点),停止移动 fast 指针。同时,移动 slow 指针,使其指向下一个节点。
  4. 删除节点: 将 slow.next 指向 slow.next.next,从而删除中间节点。
  5. 返回结果: 返回原始的头节点 head

2.2 链表算法的解题思路

链表算法的一般思路解法包括以下几个方面:

  1. 理解问题:首先,你需要理解问题的具体要求。例如,是否需要找到链表的长度,是否需要插入或删除节点,是否需要反转链表等。
  2. 选择合适的算法:根据问题的具体要求,选择合适的算法。例如,如果需要找到链表的长度,可以使用快慢指针法;如果需要插入或删除节点,可以使用双指针法;如果需要反转链表,可以使用迭代或递归方法。
  3. 定义节点和链表结构:在开始编写代码之前,你需要定义节点和链表的结构。在大多数编程语言中,你可以使用类或结构体来定义节点,使用指针或引用类型来定义链表。
  4. 实现算法:根据选择的算法,使用编程语言实现代码。在实现代码时,需要注意指针的操作,确保指针的正确指向。例如,在插入节点时,需要更新新节点和它后面节点的指针;在删除节点时,需要更新被删除节点前一个节点的指针,使其指向被删除节点的下一个节点。
  5. 测试和验证:运行代码,测试算法的正确性和效率。如果发现问题,需要对代码进行调试和修改。你可以使用一些测试用例来验证算法的正确性,例如测试空链表、只有一个节点的链表、有两个节点的链表等。
  6. 优化和改进:根据实际情况,可以对算法进行优化和改进,以提高算法的效率和适用范围。例如,可以使用哈希表来存储每个节点的值和对应的节点指针,以便快速查找节点;可以使用迭代方法来遍历链表,避免使用递归方法导致的栈溢出问题。

三、代码

3.1 方法一:快慢指针法

Java版本:

class Solution {public ListNode deleteMiddle(ListNode head) {if (head.next == null) {return null;}ListNode fast = head;ListNode slow = new ListNode(-1, head);while (fast != null && fast.next != null) {fast = fast.next.next;slow = slow.next;}slow.next = slow.next.next;return head;}
}

Pyhton版本:

class Solution:def deleteMiddle(self, head: ListNode) -> ListNode:if head.next is None:return Nonefast = headslow = ListNode(-1, head)while fast is not None and fast.next is not None:fast = fast.next.nextslow = slow.nextslow.next = slow.next.nextreturn head

C++版本:

class Solution {
public:ListNode* deleteMiddle(ListNode* head) {if (head->next == nullptr) {return nullptr;}ListNode* fast = head;ListNode* slow = new ListNode(-1, head);while (fast != nullptr && fast->next != nullptr) {fast = fast->next->next;slow = slow->next;}slow->next = slow->next->next;return head;}
};

Go版本:

type ListNode struct {Val  intNext *ListNode
}func deleteMiddle(head *ListNode) *ListNode {if head.Next == nil {return nil}fast := headslow := &ListNode{Val: -1, Next: head}for fast != nil && fast.Next != nil {fast = fast.Next.Nextslow = slow.Next}slow.Next = slow.Next.Nextreturn head
}

四、复杂度分析

4.1 方法一:快慢指针法

  • 时间复杂度: O(n)。
  • 空间复杂度: O(1)。

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

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

相关文章

基于 InternLM 和 LangChain 搭建你的知识库

1 环境配置 见&#xff1a;轻松玩转书生浦语大模型internlm-demo 配置验证过程-CSDN博客文章浏览阅读366次&#xff0c;点赞7次&#xff0c;收藏9次。InternLM-chat-7B InternLM 模型https://blog.csdn.net/cq99312254/article/details/135625924?spm1001.2014.3001.5501 1.…

借势营销怎么做才能有效宣传?媒介盒子揭秘

借势营销之所以受到品牌欢迎&#xff0c;原因就在于通过借势营销能够达到“润物细无声和四两拨千斤的效果&#xff0c;用小投入获得大回报&#xff0c;但有许多企业稍有不慎就会翻车&#xff0c;今天媒介盒子就从多个角度和大家聊聊&#xff1a;借势营销怎么做才能有效宣传。 一…

AWS CI/CD之二:配置CodeDeploy

问题 前面一篇文章介绍了CodeBuild中构建一个Java的Maven项目。在这个基础上面&#xff0c;我们继续AWS CI/CD工作流构建之路。 1.配置CodePipeline简配版 这里主要是利用CodePipeline配置之前的CodeBuild项目&#xff0c;以便生产出需要部署的jar文件和CodeDeploy需要用到相…

机器视觉系统在汽车车轮毂检测上的应用

将机器视觉用于轮毂检测&#xff0c;可以利用图像分析的方法来测量轮毂特征尺寸、判断轮毂形状&#xff0c;并获取其位置坐标等信息&#xff0c;从而能够辨识流水生产线上的各种款式和型号的汽车轮毂。 市面上对汽车车轮毂具体检测要求如下 &#xff1a; 1.为了分辨流水线上…

UI设计中的插画运用优势(上)

1. 插画是设计的原创性和艺术性的基础 无论是印刷品、品牌设计还是UI界面&#xff0c;更加风格化的插画能够将不同的风格和创意加入其中&#xff0c;在激烈的竞争中更容易因此脱颖而出。留下用户才有转化。 2. 插画是视觉触发器&#xff0c;瞬间传达大量信息 我们常说「一图胜千…

时光之美,摩登π:复古韵味,智能生活,感受独特时代氛围

在这个充满时光之美的时代&#xff0c;格力大胆地借助复古外观产品&#xff0c;为年轻人创造出一种摩登π的空调体验。时光流转&#xff0c;摩登主义的复古风潮如期而至。摩登π挂机以仿时光表盘和金属感齿轮等特色呈现时光之美&#xff0c;将岁月的磨砺融入产品设计中&#xf…

基于ssm+vue的宠物医院系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

浪潮信息与英特尔联合发布全球首个全液冷冷板服务器参考设计

1月18日&#xff0c;浪潮信息与英特尔联合发布全球首个全液冷冷板服务器参考设计&#xff0c;并面向业界开放&#xff0c;为全球液冷产业链上下游提供极具价值的参考样板&#xff0c;推动先进全液冷冷板解决方案在全球数据中心的大规模部署应用&#xff0c;实现数据中心更加绿色…

深入浅出关于go web的请求路由

文章目录 前言一、是否一定要用框架来使用路由&#xff1f;二、httprouter2.1 httprouter介绍2.2 httprouter原理2.3 路由冲突情况 三、gin中的路由四、hertz中的路由总结 前言 最近重新接触Go语言以及对应框架&#xff0c;想借此机会深入下对应部分。 并分享一下最近学的过程…

北斗卫星赋能南海渔业,助力渔船科学防灾避险

北斗卫星赋能南海渔业&#xff0c;助力渔船科学防灾避险 面向建设海洋强国战略、确保渔民生产生活安全等需求&#xff0c;海南气象部门运用北斗卫星技术创新打造海洋气象服务。 北斗船载系统创新应用是远海安全作业的坚实保障。聚焦远洋渔船获取天气信息难的问题&#xff0c;…

2024 前端高频面试题之 JS 篇

JS 篇&#xff08;持续更新中&#xff09; 1、什么是原型、原型链&#xff1f;2、什么是继承&#xff1f;说一说有哪些&#xff1f;继承组合的原理及优点&#xff1f;3、new 操作符具体干了什么&#xff1f;4、js 有哪些方法改变 this 指向&#xff1f;5、bind 有哪些实现的注意…

nginx代理本机多个端口应用

应用带根路径的情况 应用1请求为&#xff1a;http://localhost:8090/app1应用2请求为&#xff1a;http://localhost:8091/app2 将根路径直接去掉&#xff0c;即 / 应用1请求为&#xff1a;http://localhost:8090/应用2请求为&#xff1a;http://localhost:8091/ 最后的/…