链表常见OJ题

目录

题目一:移除链表元素

(1)题目链接

(2)题目要求

(3)题解

题目二:反转链表

(1)题目链接

(2)题目要求​编辑

(3)题解

题目三:链表的中间节点

(1)题目链接

(2)题目要求

题目四:返回倒数第k个节点

(1)题目链接

 (2)题目要求

(3)题解

题目五:合并两个有序链表

(1)题目链接

 (2)题目要求

(3)题解


题目一:移除链表元素

(1)题目链接

移除链表元素icon-default.png?t=N7T8https://leetcode.cn/problems/remove-linked-list-elements/description/

(2)题目要求

(3)题解

操作:

  1. cur代表当前需要删除的节点

    prev代表当前需要删除节点cur的前驱节点

  2. 如果找到需要删除的节点,prev.next = cur.next;cur = cur.next;

  3. 如果没找到所要删除的节点,移动prev节点prev = cur;再移动cur判断下一个节点cur = cur.next;

  4. 最后的效果

  5. 如何处理头节点就是要删除的节点的情况?
    先将头节点以外的删除再来考虑头节点位置即可
    if(head.val == val) {
                head = head.next;
            }
    也可先考虑头节点的情况,while循环判断
     

public void removeAllKey(int val) {//1. 判空if (head == null) {head = head.next;}//2. 定义prev 和 curListNode prev = head;ListNode cur = head.next;//3.开始判断并且删除while (cur != null) {if (cur.val == val) {//找到了prev.next = cur.next;} else {prev = cur;}cur = cur.next;}//4.处理头节点if(head.val == val) {head = head.next;}}
public ListNode removeElements(ListNode head, int val) {  // 1. 处理头节点  while (head != null && head.val == val) {  head = head.next;  }  // 2. 如果链表为空,直接返回  if (head == null) {  return head;  }  ListNode cur = head;  // 3. 开始判断并且删除  while (cur.next != null) {  if (cur.next.val == val) {  // 找到了  ListNode del = cur.next;  cur.next = del.next;  } else {  cur = cur.next;  }  }  // 4. 这里不需要再处理头节点,因为在循环开始前已经处理过了  return head;  }  

题目二:反转链表

(1)题目链接

反转链表icon-default.png?t=N7T8https://leetcode.cn/problems/reverse-linked-list/description/

(2)题目要求

(3)题解

思路:

  1. 采用头插法,将头节点以外的节点依次插入到头节点前面并改变next的指向

操作:

  1. 首先我们判断头节点head为空的情况,为空时返回head即可
  2. cur节点表示什么?定义一个cur节点表示头结点的下一个节点,表示我们从头节点的下一个节点开始进行头插
  3. curN节点表示什么?curN节点表示记录cur的下一个节点,当我们头插一个节点之后为了不丢失下一个结点的地址,我们需要提前记录下这个节点的地址,以便进行下一次头插
  4. 在进行一次头插后我们就改变头节点head的位置,同时cur向后移动进行下一次头插
public ListNode reverseList(ListNode head) {if (head == null) {return head;}ListNode cur = head.next;head.next = null;while (cur != null) {ListNode curN = cur.next;cur.next = head;head = cur;cur = curN;}return head;}

题目三:链表的中间节点

(1)题目链接

链表的中间节点icon-default.png?t=N7T8https://leetcode.cn/problems/middle-of-the-linked-list/description/

(2)题目要求

 (3)题解

寻找中间节点用到了非常经典的快慢指针方法

思路:

  1. 使用两个指针变量,刚开始都位于链表的第 1 个结点,一个永远一次只走 1 步,一个永远一次只走 2 步,一个在前,一个在后,同时走。这样当快指针走完的时候,慢指针就来到了链表的中间位置。

  2. 这道题换一种说法其实就是简单的数学问题,有两个人,fast和slow,fast的速度是2,slow的速度是1,它们从起点同时出发,当fast到达终点时,slow就在路程的中点,而slow所在的位置就是我们要返回的中间节点

操作:

  1. fast和slow在同一起点,也就是head
  2. 循环条件是什么?
    这里我们要考虑到奇数节点和偶数节点的区别
    当链表的节点数为偶数时,fast == null时找到中间节点停止循环
    当链表的节点数为奇数时,fast.next == null时找到中间节点停止循环

public ListNode middleNode(ListNode head) {ListNode fast = head;ListNode slow = head;while (fast != null && fast.next != null) {ListNode tmp = fast.next;fast = tmp.next;slow = slow.next;}return slow;}

题目四:返回倒数第k个节点

(1)题目链接

返回倒数第k个节点icon-default.png?t=N7T8https://leetcode.cn/problems/kth-node-from-end-of-list-lcci/description/

 (2)题目要求

(3)题解

思路:

因为题目要求是返回导数第k个节点,在这里我们依然使用的是快慢指针方法

我们先让fast走k步,来抵消倒数的这个差值,然后再让fast和slow同时走

操作:

  1. fast和slow从同一起点head出发
  2. 先将fast走k步再让它们同时走,直到fast为空时返回slow即可
    public int kthToLast(ListNode head, int k) {ListNode fast = head;ListNode slow = head;for(int i = 0;i < k;i++) {fast = fast.next;}while(fast != null) {fast = fast.next;slow = slow.next;}return slow.val;}

题目五:合并两个有序链表

(1)题目链接

合并两个有序链表icon-default.png?t=N7T8https://leetcode.cn/problems/merge-two-sorted-lists/description/

 (2)题目要求

(3)题解

思路:

  1. 将两个链表的头节点依次进行比较,如果headA.val < headB.val,则tmp.next = headA,让headA往后走一步,tmp也往后走一步;headA.val > headB.val同理
  2. 如果A链表或B链表中有一个提前遍历完,那么再往后走就指null,这时tmp.next及时接上那个未遍历完的链表节点。

操作:

  1. 创建一个傀儡节点,用来指向两个链表头节点较小的一个
  2. 循环条件是什么?在两个链表的长度长度不同时,我们需要当一个链表判断完时接上另一个链表,这时我们要确保短的链表每个节点的val都判断到,也就是两个链表的不能为null,也就是headA != null && headB != null
  3. 要考虑两个链表空的情况,当A为空时直接指向B即可,否则相反
 public ListNode mergeTwoLists(ListNode headA, ListNode headB) {ListNode newH = new ListNode();ListNode tmp = newH;while(headA != null && headB != null) {if(headA.val < headB.val) {tmp.next = headA;headA = headA.next;tmp = tmp.next;} else{tmp.next = headB;headB = headB.next;tmp = tmp.next;}}if(headA != null) {tmp.next = headA;} else {tmp.next = headB;}return newH.next;}

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

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

相关文章

蓝桥杯备战.19有奖问答dfs

P9230 [蓝桥杯 2023 省 A] 填空问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using namespace std; #define endl \n //#define int long long const int N 2e510; int a[N],w[N]; int ans 0; void dfs(int score,int cnt) {if(cnt>3…

项目9-网页聊天室1(注册+Bycrpt加密)

1.准备工作 1.1.前端页面展示 1.2 数据库的建立 我们通过注册页面&#xff0c;考虑如何设计用户表数据库。 用户id&#xff0c;userId用户名&#xff0c;唯一&#xff0c;username用户密码&#xff0c;password&#xff08;包括密码和确认密码ensurePssword【数据库没有该字段…

【简单介绍下Milvus】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

网络3--网络通信的深度理解(端口号)

网络通信的进一步理解 两个主机间进行通信&#xff0c;其实是两个主机间的软件进行通信&#xff0c;软件也就是可执行程序&#xff0c;运行时就是进程&#xff0c;所以也为进程间通信。 进程间通信需要共享资源&#xff0c;这里两个主机间的共享资源是网络&#xff0c;利用的是…

Visual Studio生成C++的DLL文件(最简单版)

前言 当你在使用C编写一些可重用的代码时&#xff0c;将其打包成一个动态链接库&#xff08;DLL&#xff09;可以使其更容易地被其他项目或者程序调用和使用。Visual Studio提供了一种简单的方式来生成C的DLL文件。下面是一个关于如何在Visual Studio中生成C的DLL文件的简单教…

【 第一性原理计算方法及应用】

第一性原理计算方法及应用述

对接极速行情丨DolphinDB MDL 行情插件使用指南

通联数据依托于金融大数据&#xff0c;结合人工智能技术为投资者提供个性化、智能化、专业化投资服务&#xff0c; MDL 则是通联数据提供的高频行情数据服务。DolphinDB 提供了能够从 MDL 服务器获取高频行情数据的 DolphinDB MDL 插件&#xff0c;帮助用户方便地通过 DolphinD…

算法day06

第一题 1658. 将 x 减到 0 的最小操作数 如题上述&#xff1a; 本题原来的意思给定一个数字x&#xff0c;从数组的左边或者右边 使用x减去数组中的数字&#xff0c;直到减去最后一个数字为0时&#xff0c;返回最小的操作次数&#xff1b;如果最终减去的数组中的数字之后不能得…

HR系统组合漏洞挖掘过程

前言 某天在项目中遇到了一个奇怪的人才管理系统&#xff0c;通过FOFA&#xff08;会员可在社区获取&#xff09;进行了一番搜索&#xff0c;发现了该系统在互联网上的使用情况相当广泛。于是&#xff0c;我开始了后续的审计过程。 在搜索过程中&#xff0c;我偶然间找到了一份…

「TypeScript系列」TypeScript 基础类型

文章目录 一、TypeScript 基础类型1. **Number**: 用于表示数字。可以是整数或浮点数。2. **String**: 用于表示文本类型的数据。3. **Boolean**: 表示逻辑值&#xff1a;true 或 false。4. **Array**: 表示一组值。TypeScript 使用泛型&#xff08;generics&#xff09;来定义…

Mysql存储引擎对比

存储引擎InnoDBMyISAM文件存储结构.frm文件&#xff1a;存放表结构的定义信息 .ibd文件或.ibdata文件&#xff1a;存放InnoDB数据&#xff08;数据和索引&#xff09;【独享表空间】每个表一个.ibd文件【共享表空间】所有表使用一个.ibdata文件- .frm文件&#xff1a;存放表结构…

Nginx静态压缩和代码压缩,提高访问速度!

一、概述 基于目前大部分的应用&#xff0c;都使用了前后端分离的框架&#xff0c;vue的前端应用&#xff0c;也是十分的流行。不知道大家有没有遇到这样的问题&#xff1a; 随着前端框架的页面&#xff0c;功能开发不断的迭代&#xff1b;安装的依赖&#xff0c;不断的增多&a…

机器学习【简述】

什么是机器学习 机器学习研究的是计算机怎么模拟人类的学习行为&#xff0c;以获取的知识或技能&#xff0c;并重新组织已有的知识结构使之不断改善自身。简单一点说&#xff0c;就是计算机从数据中学习初规律和模式&#xff0c;以应用在新数据上做预测的任务。近年来互联网数…

无人机的用途

无人机&#xff0c;即无人驾驶飞机&#xff0c;其用途广泛且多样&#xff0c;涉及到多个领域。 在农业领域&#xff0c;无人机通过搭载各种传感器和相机&#xff0c;可以对农田进行空中巡视&#xff0c;收集农田数据&#xff0c;如土壤含水量、气温、湿度等&#xff0c;以及植…

详细的性能分析和调优的示例过程:

当面临数据库查询性能下降的问题时&#xff0c;以下是一个详细的性能分析和调优的示例过程&#xff1a; ### 1. 监控和识别问题 假设你负责维护一个电子商务网站数据库&#xff0c;最近用户反映搜索功能响应慢。你立即使用数据库监控工具&#xff08;如Prometheus、Grafana&am…

Ardupilot开源飞控工程项目编译回顾

Ardupilot开源飞控工程项目编译回顾 1. 源由2. 工程编译3. 命令列表3.1 工作环境设置3.2 获取工程代码3.3 建立编译环境3.4 编译工程代码3.5 保存编译结果3.6 清理编译结果3.7 编译设备目标 4. 补充 1. 源由 最近&#xff0c;有点莫名的连续遇到了2次Ardupilot编译报错。百思不…

Quartz.Net(2)——NetCore3.1整合Quartz.Net

在上篇文章中Quartz.Net(1) 已经介绍了Quartz.Net的基本运用&#xff0c;该篇文章中将主要介绍NetCore3.1如何整合Quartz.Net&#xff0c;在后台运行定时job&#xff0c;并运用到上篇文章讲到的介绍点。 1 导入Nuget包 <PackageReference Include"Quartz" Versio…

PyTorch中的torch.cuda.amp.autocast

torch.cuda.amp.autocast的使用 torch.cuda.amp.autocast是PyTorch中一种自动混合精度计算的方法&#xff0c;它允许在深度学习模型的训练过程中自动执行混合精度计算&#xff0c;从而加快训练速度并减少显存占用。 在使用torch.cuda.amp.autocast时&#xff0c;一般会将模型…

Ubuntu系统如何使用宝塔面板搭建HYBBS论坛并发布公网远程访问

文章目录 前言1. HYBBS网站搭建1.1 HYBBS网站安装1.2 HYBBS网站测试1.3. cpolar的安装和注册 2. 本地网页发布2.1.Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3.公网访问测试总结 前言 在国内…

【智能算法】河马优化算法(HO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;MH Amiri受到自然界河马社会行为启发&#xff0c;提出了河马优化算法&#xff08;Hippopotamus Optimization Algorithm, HO&#xff09;。 2.算法原理 2.1算法思想 …