当前位置: 首页 > news >正文

面试金典题2.3

若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该链表的「中间节点」。

假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。

例如,传入节点 c(位于单向链表 a->b->c->d->e->f 中),将其删除后,剩余链表为 a->b->d->e->f

示例:

输入:节点 5 (位于单向链表 4->5->1->9 中)
输出:不返回任何数据,从链表中删除传入的节点 5,使链表变为 4->1->9

这道题的方法很简单,只要清楚链表的储存方式就可以。已知给出的中间节点为node,那么我们想要删除这个节点,只需要将这个节点的值变为下一个节点的值,我们就得到了两个值相同的节点,然后我们将下下个节点指向需要删除节点的下一个节点,就完成删除了。实际上是删除了中间节点的下一个节点,但是因为我们因为将下一个节点的值赋给中间节点,因此,我们可以直接删除中间节点的下一个节点。这样说可能不太清楚,其实我们把我们要删除的节点定义为当前节点,那么我们就可以直接让当前节点的前驱节点指向后继节点就实现了删除。类比到这个题里,当前节点并不是题目中给出的中间节点,而是它的下一个节点,因此我们先将中间节点的值变为下一个节点的值,再删除下一个节点,那么实际看到的结果就是删除了中间节点。

leetcode代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:void deleteNode(ListNode* node) {node->val=node->next->val;node->next=node->next->next;}
};

其实我一开始没有注意到这个题是直接给出要删除的节点,我以为的中间节点是要自己找的。理解错题意了。那么如果要找真正意义上的中间节点该怎么做呢?请往下看

其实找中间节点,主要是看数的总数为偶数的情况,到底是选择靠前的那个节点还是靠后的节点,而思路和上一个找倒数第k个节点的题类似,都是使用双指针去找,同样将两个指针先指向头节点,而中间节点就是在1/2的位置,那么我们只要让两个指针的移动速度为两倍差,但是如果数的个数为偶数的话,那么找到的节点就是靠后的那个节点。

leetcode代码

class Solution {
public:ListNode* middleNode(ListNode* head) {if(head==nullptr&&head->next==nullptr){return head;}ListNode *p = head;ListNode *q = head;while(p != nullptr && q->next != nullptr) {q = q->next;p = p->next->next;}return q;} 
};

那么如果我们要找到的是靠前的那个节点呢?

class Solution {  
public:  ListNode* middleNode(ListNode* head) {  if (head == nullptr || head->next == nullptr) {  // 如果链表为空或只有一个节点,则直接返回头节点  return head;  }  ListNode *p = head;  ListNode *q = head;  while (p->next != nullptr && p->next->next != nullptr) {  // p 每次移动两步,直到 p->next 或 p->next->next 为空  p = p->next->next;  // q 每次移动一步  q = q->next;  }  // 当 p 无法再安全地前进两步时(即 p->next 或 p->next->next 为空),q 指向“靠前的”中间节点  return q;  }  
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++第2课——取余运算符的应用、浮点型和字符型(含视频讲解)
  • 工业数据采集系统
  • 828华为云征文|华为云Flexus云服务器X实例Windows系统部署一键短视频生成AI工具moneyprinter
  • 信息安全工程师(16)密码学概况
  • Vue(16)——Vue3.3新特性
  • 详解 C++中的模板
  • JAVA基本简介(期末)
  • MongoDB解说
  • 9.24工作笔记
  • Spark 任务与 Spark Streaming 任务的差异详解
  • 9.创新与未来:ChatGPT的新功能和趋势【9/10】
  • fastadmin 根据选择数据来传参给selectpage输入框
  • 【算法】模拟:(leetcode)6.Z 字形变换(medium)
  • Java提供了一个跨平台的换行符\n
  • YOLOv5物体检测
  • [nginx文档翻译系列] 控制nginx
  • 78. Subsets
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • C++类中的特殊成员函数
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • exif信息对照
  • Flannel解读
  • Java基本数据类型之Number
  • Js基础知识(四) - js运行原理与机制
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • React系列之 Redux 架构模式
  • sessionStorage和localStorage
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • SpriteKit 技巧之添加背景图片
  • 半理解系列--Promise的进化史
  • 分布式任务队列Celery
  • 前嗅ForeSpider采集配置界面介绍
  • 使用parted解决大于2T的磁盘分区
  • 译自由幺半群
  • 责任链模式的两种实现
  • 最近的计划
  • C# - 为值类型重定义相等性
  • gunicorn工作原理
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # Maven错误Error executing Maven
  • (1)常见O(n^2)排序算法解析
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (C#)一个最简单的链表类
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (六)Flink 窗口计算
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (四)JPA - JQPL 实现增删改查
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)jQuery 基础