链表常见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,一经查实,立即删除!

相关文章

项目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;我偶然间找到了一份…

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

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

无人机的用途

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

【C++】AVL

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、AVL 树 1.1、AVL树的概念 1.2、AVL树节点的定义 1.3、AVL树的插入 1.4、AVL树的旋转 1.4.1、新节点插入较高左子树的左侧---左左&#xff1a;右单旋 1…

Spring整体流程源码分析

DisableEncodeUrlFilter 防止sessionId被泄露 包装器模式 WebAsyncManagerIntegrationFilter WebAsyncManagerIntegrationFilter通常与Spring MVC的异步请求处理机制一起使用&#xff0c;确保在使用Callable或DeferredResult等异步处理方式时&#xff0c;安全上下文能够正…

CSP备考---位运算

前言 本期我们将学习位运算&#xff0c;与本期类型的考点&#xff08;二进制转换&#xff09;反码、补码、原码。 1、位运算是什么 首先我们需要先了解位运算是什么。 我们知道&#xff0c;计算机中的数在内存中都是以二进制形式进行存储的 &#xff0c;而位运算就是直接对整…

打造本地GPT专业领域知识库AnythingLLM+Ollama

如果你觉得openai的gpt没有隐私&#xff0c;或者需要离线使用gpt&#xff0c;还是打造专业领域知识&#xff0c;可以借用AnythingLLMOllama轻松实现本地GPT. AnythingLLMOllama 实现本地GPT步聚&#xff1a; 1 下载 AnythingLLM软件 AnythingLLM官网地址&#xff1a; Anythi…

功能卓越,未来可期!实在Agent智能体公测圆满收官

“被需要的智能才是实实在在的智能。”一直以来&#xff0c;实在智能始终坚持从行业本质出发思考如何围绕客户需求打造更智能、更普惠的智能体数字员工&#xff0c;切实关注用户真实的使用体验与感受。 自2020年7月起&#xff0c;实在智能率先推出第一代实在RPA数字员工&#…

SpringBoot设置默认文件大小

1、问题发现 有个需求&#xff0c;上传文件的时候&#xff0c;发现提示了这个错误&#xff0c;看了一下意思是说&#xff0c;文件超过了1M。 看我们文件的大小&#xff1a; 发现确实是&#xff0c;文件超出了1M&#xff0c;查了一下资料&#xff0c;tomcat默认上传文件大小为1M…

简单粗暴的翻译英文pdf

背景&#xff1a;看书的时候经常遇到英文pdf&#xff0c;没有合适的翻译软件可以快速翻译全书。这里提供一个解决方案。 Step 1 打开英文pdfCTRLA全选文字CTRLC复制打开记事本CTRLV复制保存为data.txt Step 2 写一个C脚本 // ToolPdf2Html.cpp : 此文件包含 "main&quo…

大型语言模型自我进化综述

24年4月来自北大的论文“A Survey on Self-Evolution of Large Language Models”。 大语言模型&#xff08;LLM&#xff09;在各个领域和智体应用中取得了显着的进步。 然而&#xff0c;目前从人类或外部模型监督中学习的LLM成本高昂&#xff0c;并且随着任务复杂性和多样性的…