【LeetCode刷题笔记】反转链表、移除链表元素、两两交换链表中的节点、删除链表的倒数第N个结点

news2024/12/23 16:37:37

📝个人主页:爱吃炫迈
💌系列专栏:数据结构与算法
🧑‍💻座右铭:道阻且长,行则将至💗

文章目录

  • 反转链表
  • 移除链表元素
  • 两两交换链表中的节点
  • 删除链表的倒数第 N 个结点
  • 💞总结💞


反转链表

LeetCode题目:反转链表
思路 :

改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表。如下图所示:

在这里插入图片描述
步骤
在这里插入图片描述

  • pre:表示当前需要反转节点的前一个节点
  • node:表示当前到达的节点
  1. 定义两个指针prenodepre在前,node在后
  2. 每次让node.next指向pre,实现一次局部反转
  3. 局部反转完成之后,prenode都向前移动一个位置
  4. 循环上述过程,直到node到达链表尾部

代码

var reverseList = function (head) {
  let pre = null; //当前需要翻转节点的前一个节点
  let node = head; //当前需要翻转的节点
  while (node) {
    let nextNode = node.next;
    // 翻转指针
    node.next = pre;
    // pre和node都往后移动
    pre = node;
    node = nextNode;
  }
  // 此时pre是新的头结点,所以返回
  return pre;
};

移除链表元素

LeetCode题目:移除链表元素
思路 :

用迭代的方法删除链表中所有节点值等于特定值的节点。如下图所示:

在这里插入图片描述

  • 这种情况下的移除操作,就是让节点next指针直接指向下下一个节点就可以了,
  • 那么因为单链表的特殊性,只能指向下一个节点,刚刚删除的是链表的中第二个,和第四个节点,那么如果删除的是头结点又该怎么办呢?

🌷🌷可以设置一个虚拟头结点在进行删除操作:使得头结点和其他节点删除操作相同。

步骤
在这里插入图片描述

  • dummy node:虚拟头节点
  1. 创建一个虚拟的头节点,并将该节点的next指针指向原链表的头节点。
  2. 判断node.next.val===val是否成立,若成立将node的next指针指向下下个节点,即ndoe.next=node.next.next
  3. node向后移动,直到迭代结束
  4. 最后函数返回虚拟头节点的next指针,真正的头结点

代码

var removeElements = function (head, val) {
  // 虚拟头结点,值为0,指向head
  const dummyNode = new ListNode(0, head);
  let node = dummyNode;
  while (node) {
    if (node.next.val === val) {
      node.next = node.next.next;
      continue;
    }
    node = node.next;
  }
  return dummyNode.next;
};


两两交换链表中的节点

LeetCode题目:两两交换链表中的节点
思路 :

通过迭代的方式实现两两交换链表中的节点。

步骤

  1. 创建虚拟头结点 dummyHead,令 dummyHead.next = head。
    在这里插入图片描述
  2. temp.next=node2,令temp->node2节点
  • temp:表示当前到达的节点
  • node1:表示temp的后一个节点
  • node2:表示temp的后两个节点
    在这里插入图片描述
  1. node1.next=node2.next,令node1->node2的下一个节点
    在这里插入图片描述
  2. node2.next=node1,令node2->node1,完成这步操作后,节点关系变成temp->node2->node1
    在这里插入图片描述
  3. temp=node1,对链表中的其余节点进行两两交换,直到全部节点都被两两交换。
    在这里插入图片描述
  4. 重复上面操作,直到 temp 的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。

代码

var swapPairs = function (head) {
  // 虚拟头结点
  const temp = new ListNode(0, head);
  let node = temp;
  while (node.next && node.next.next) {
    let node1 = node.next;
    let node2 = node.next.next;

    node.next = node2;
    node1.next = node2.next;
    node2.next = node1;
    node = node1;
  }
  return temp.next;
};

删除链表的倒数第 N 个结点

LeetCode题目:删除链表的倒数第N个结点
思路1 :

两次遍历链表,第一次遍历得到链表的长度len,第二次遍历删除倒数第n个结点

  • 倒数第n个结点,正向下标为:len-n
  • 若创建了虚拟头结点,则正向下标为:len-n+1
  • 此方法遍历链表两次

代码

var removeNthFromEnd = function (head, n) {
  let len = 0;
  const temp = new ListNode(0, head);
  let node = temp;
  // 链表的节点个数为len
  while (node) {
    node = node.next;
    len++;
  }
  // 被删节点的下标为deleNode
  let deleNode = len - n;
  let lastNode = null;
  node = temp;
  for (let i = 0; i < deleNode; i++) {
    //将当前节点赋值给上一个节点
    lastNode = node;
    //将当前节点更新为下一个节点
    node = node.next;
  }
  // 赋值上一个节点的下一个节点为当前节点的下一个节点即可删除该节点
  lastNode.next = node.next;
  return temp.next;
};

思路2

双指针:

  • 创建虚拟结点
  • 我们可以使用两个指针 firstsecond 同时对链表进行遍历;
  • secondfirst超前且相隔n个结点。当 second 遍历到链表的末尾(null)时,first 就恰好处于倒数第 n+1(3)个节点。
  • 此方法遍历链表一次

动图演示
请添加图片描述
步骤

  1. 设置虚拟节点dummyHead指向 head
  2. 设定双指针 firstsecond,初始都指向虚拟节点 dummyHead
  3. 移动second ,直到 firstsecond 之间相隔的元素个数为 n
  4. 同时移动 firstsecond,直到 second指向的为 NULL
  5. first 的下一个节点指向下下个节点

代码

var removeNthFromEnd = function (head, n) {
  const dummyHead = new ListNode(0, head);
  let first = dummyHead;
  let second = dummyHead;
  for (let i = 0; i <= n; i++) {
    //n2移动n+1次
    second = second.next;
  }

  while (second) {
  // first和second同时移动
    first = first.next;
    second = second.next;
  }
  // 令first指向first的下下个结点,即删除first的下个结点
  first.next = first.next.next;
  return dummyHead.next;
};


💞总结💞

希望我的文章能对你学习链表的知识有所帮助!

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

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

相关文章

脉搏波信号去噪方法

一、引言 脉搏波信号是血管中血液流动产生的振动信号&#xff0c;反映了血管的弹性特性和血流动力学信息。由于其丰富的生理信息&#xff0c;脉搏波信号在诊断和监测心血管疾病、神经系统疾病等方面具有重要意义。然而&#xff0c;原始脉搏波信号往往受到生理干扰、环境噪声等…

人工智能在心电信号的心律失常应用

心律失常是一种常见的心脏疾病&#xff0c;它会导致心脏跳动不规律&#xff0c;严重的甚至会引发心脏骤停。传统的心律失常诊断方法是通过心电图对心律失常进行分析&#xff0c;但是这种方法需要医生具备专业的知识和经验&#xff0c;而且容易出现误诊。而人工智能技术可以对心…

倾斜摄影三维模型OSGB格式转换3DTILES的关键技术浅析

倾斜摄影三维模型OSGB格式转换3DTILES的关键技术浅析 将三维模型从OSGB格式转换为3DTILES格式需要掌握以下关键技术&#xff1a; 1、数据结构转换&#xff1a;OSGB格式和3DTILES格式采用了不同的数据结构&#xff0c;因此需要进行数据结构转换。OSGB格式采用了分层划分数据结构…

D3.js(3) path/折线图

一、概念 path 元素是用来绘制各种形状&#xff08;例如线条、曲线、弧形、圆弧等&#xff09;的元素。path 元素的 d 属性用来定义绘制的路径。具体来说&#xff0c;d 属性是一个字符串&#xff0c;包含一系列的命令和参数&#xff0c;用来描述路径的形状。 1.1 d属性 Mmov…

Linux子进程信号处理机制

Linux中子进程的信号处理与父进程的联系有以下三条&#xff1a; fork后子进程会继承父进程绑定的信号处理函数&#xff08;很好解释&#xff0c;子进程会拷贝父进程的代码&#xff0c;包括信号处理函数&#xff09;如果子进程调用exec族函数&#xff0c;子进程代码段被新的程序…

Qt 项目Mingw编译器转换为VS编译器时的错误及解决办法

错误 在mingw生成的项目&#xff0c;转换为VS编译器时通常会报些以下错误&#xff08;C4819警告&#xff0c;C2001错误&#xff0c;C2143错误&#xff09; 原因及解决方式 这一般是由于字符编码引起的&#xff0c;在源代码文件中包含了中文字符导致的。Qt Creator 生成的代码文…

算法的时间复杂度和空间复杂度分析

文章目录 实验目的实验内容实验过程运行结果复杂度分析 实验目的 通过本次实验&#xff0c;了解算法复杂度的分析方法&#xff0c;掌握递归算法时间复杂度的递推计算过程。 实验内容 二路归并排序的算法设计和复杂度分析。 实验过程 1.算法设计 归并排序&#xff1a;是指将…

活动回顾|多模态 AI 开发者的线下聚会@深圳站(内含福利)

回顾来了&#xff01; 4 月 22 日&#xff0c;由 Jina AI 和 OpenMMLab 联合主办的 「多模态 AI 」Office Hours 深圳站圆满结束&#xff0c;迎来了将近 60 位开发者的热情参与&#xff01;现场不仅有别开生面的「开发者集市」供大家打卡赢取好礼&#xff0c;更有四场干货满满的…

传统机器学习(六)集成算法(1)—随机森林算法及案例详解

传统机器学习(六)集成算法(1)—随机森林算法及案例详解 1、概述 集成学习&#xff08;Ensemble Learning&#xff09;就是通过某种策略将多个模型集成起来&#xff0c;通过群体决策来提高决策准确率。 集成学习首要的问题是选择什么样的学习器以及如何集成多个基学习器&…

杂谈 看唯工具论的问题 与 瑞典马工的一些言论 如何辩证看

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

华为OD机试真题(Java),根据员工出勤信息,判断本次是否能获得出勤奖(100%通过+复盘思路)

一、题目描述 公司用一个字符串来标识员工的出勤信息 absent&#xff1a;缺勤late&#xff1a;迟到leaveearly&#xff1a;早退present&#xff1a;正常上班 现需根据员工出勤信息,判断本次是否能获得出勤奖&#xff0c;能获得出勤奖的条件如下&#xff1a; 缺勤不超过1次没…

闲聊之π和e到底是个啥

π和e 1. 圆周率π 耳熟能详的π&#xff0c;到底是什么&#xff0c;怎么来的&#xff1f; 圆周率π&#xff0c;圆的周长C2πr&#xff0c;其中r是圆的半径 1.1 刘徽割圆术 如图中所示&#xff0c;作出圆内的正十二边形&#xff0c;正二十四边形&#xff0c;…&#xff0c;用…

倾斜摄影三维模型OSGB格式 到OBJ 格式转换几个软件操作方法

倾斜摄影三维模型OSGB格式 到OBJ 格式转换几个软件操作方法 倾斜摄影三维模型是一种重要的三维地理信息数据&#xff0c;通常以OSGB格式保存。但在不同的三维软件中使用时&#xff0c;需要将其转换为更通用的OBJ格式。本文将介绍在技术上如何将OSGB格式的倾斜摄影三维模型转换为…

手机投屏到电脑的实用工具

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 背景说明 最近在项目开发工作中需要将手机屏幕投影到PC端&#xff0c;并通过PC端操作手机。为了满足该项开发需求&#xff0c;在项目小组中采用了Vysor作为工具。 Vysor介…

手写axios源码系列四:interceptor拦截器

文章目录 一、拦截器 interceptor1、创建 InterceptorManager.js 文件2、Axios 中实例化 InterceptorManager 类3、总结 在本系列的第一篇章节 手写axios源码系列一&#xff1a;axios核心知识点 中已经介绍过一些拦截器的基础知识&#xff0c;可知拦截器分为&#xff1a; 请求…

24从零开始学Java之如何正确地使用一维数组

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在之前的文章中&#xff0c;壹哥给大家讲解了java里的顺序结构、分支结构、循环结构等内容&#xff0…

diffusion扩散模型之hello world

以mnist图像生成样本为例&#xff0c;详细解释diffusion的每个步骤和过程 扩散模型包括两个过程&#xff1a;前向过程&#xff08;forward process&#xff09;和反向过程&#xff08;reverse process&#xff09;&#xff0c;其中前向过程又称为扩散过程&#xff08;diffusio…

Taro React组件开发(9) —— RuiCountDown 倒计时

1. 需求实现 根据传入的格式,返回倒计时的文本字段;时间格式需要自定义,需要返回对应时间的值;对毫秒级的时间进行渲染;自定义时间的样式;手动控制倒计时的开始、暂停和重置。2. 需求实现 查找网上类似组件 uView CountDown 倒计时;由于 uView CountDown 倒计时 是使用 …

深度学习 - 42.特征交叉与 SetNET、Bilinear Interaction 与 FiBiNet

目录 一.引言 二.摘要 - ABSTRACT 三.介绍 - INTRODUCTION 四.相关工作 - RELATED WORK 1.因式分解机及其变体 - Factorization Machine and Its relevant variants 2. 基于深度学习的点击率模型 - Deep Learning based CTR Models 3.SENET Module 五.FiBiNet Model 1…

【嵌入式】HC32F定时器PWM捕获+APC芯片实现模拟AD采样

目录 一 项目背景 二 原理说明 三 设计实现——定时器初始化 四 设计实现——PWM捕获 五 梳理总结 一 项目背景 目前使用了TI的ADC采样芯片ADS1018实现模拟量4-20mA/0-20mA的采样&#xff0c;原理是将外部输入的模拟量信号4-20mA&#xff0c;经由并联的两个100Ω电阻&#…