链表常见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 和 cur
        ListNode 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;
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【PostgreSQL里的子查询解析】

什么是子查询&#xff1f; 子查询是一种嵌套在其他SQL查询中的查询方式&#xff0c;也可以称作内查询或嵌套查询。当一个查询是另一个查询的条件时&#xff0c;就称之为子查询。子查询的语法格式与普通查询相同&#xff0c;但其在查询过程中起着临时结果集的作用&#xff0c;为…

冰川秘境:全球冰川可视化大屏带你穿越冰原

在浩瀚无垠的宇宙中&#xff0c;地球以其独特的蓝色光环吸引着人们的目光。而在这颗蓝色星球上&#xff0c;冰川这一大自然的杰作&#xff0c;更是以其壮美与神秘&#xff0c;让人们心驰神往。 从阿尔卑斯山脉的冰川到南极洲的冰盖&#xff0c;从格陵兰岛的冰山到喜马拉雅山脉的…

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

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

基于ChatGPT 和 OpenAI 模型的现代生成式 AI

书籍&#xff1a;Modern Generative AI with ChatGPT and OpenAI Models: Leverage the capabilities of OpenAIs LLM for productivity and innovation with GPT3 and GPT4 作者&#xff1a;Valentina Alto 出版&#xff1a;Packt Publishing 书籍下载-《基于ChatGPT 和 Op…

【Unity】 HTFramework框架(四十八)使用Location设置Transform位置、旋转、缩放

更新日期&#xff1a;2024年5月14日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 Location定义Location复制Location变量的值复制Transform组件的Location值粘贴Location变量的值粘贴Location值到Transform组件在代码中使用Location Loc…

2.3 应用集成技术

第2章 信息技术知识 2.3 应用集成技术 2.3.1 数据库与数据仓库技术 数据库 以单一的数据源即数据库为中心进行事务处理、批处理、决策分析等各种数据处理工作操作型处理也称事务处理&#xff0c;指的是对联机数据库的日常操作&#xff0c;通常是对数据库中记录的查询和修改…

微信小程序主体变更的操作教程

小程序迁移变更主体有什么作用&#xff1f;进行小程序主体迁移变更&#xff0c;那可是益处多多呀&#xff01;比方说&#xff0c;能够解锁更多权限功能&#xff1b;在公司变更或注销时&#xff0c;还能保障账号的正常使用&#xff1b;此外&#xff0c;收购账号后&#xff0c;也…

Nat Plants | 植物抽核单细胞!多组学探究大豆根瘤成熟过程

发表时间&#xff1a;2023-04 发表期刊&#xff1a;Nature Plants 影响因子&#xff1a;17.352 DOI&#xff1a;10.1038/s41477-023-01387-z 研究背景 根瘤菌是亲和互作寄主植物&#xff0c;感染宿主并在根部形成共生器官根瘤&#xff0c;具有固氮…

vue3中通过自定义指令实现loading加载效果

前言 在现代Web开发中&#xff0c;提升用户体验一直是开发者们追求的目标之一。其中&#xff0c;一个常见的场景就是在用户与应用程序进行交互时&#xff0c;特别是当进行异步操作时&#xff08;如网络请求&#xff09;&#xff0c;为用户提供即时的反馈&#xff0c;避免用户因…

docker实验

1.Docker安装部署 &#xff08;1&#xff09;.关闭防火墙 &#xff08;2&#xff09;.更新源 &#xff08;3&#xff09;设置Docker仓库 &#xff08;4&#xff09;启动docker &#xff08;5&#xff09;查看版本&#xff1a; 2.Docker pull 容器并运行服务&#xff1b; 拉取…

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

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

PXI/PXIe规格 A429/717 航电总线适配卡

A429是一款标准的PXI/PXIe1规格的多协议总线适配卡。该产品最多支持36个A429通道&#xff0c;或32个A429通道加4个A717通道&#xff0c;每个A429和A717通道可由软件配置成接收或发送&#xff0c;可满足A429总线和A717总线的通讯、测试和数据分析等应用需求。 该产品的每个A429通…

儿童身高成长:关注每一厘米的成长

引言&#xff1a; 儿童的身高发育是家长和教育者普遍关注的问题&#xff0c;它不仅关乎孩子的外貌形象&#xff0c;更与孩子的健康成长密切相关。本文将深入探讨儿童身高的注意事项&#xff0c;为家长和教育者提供科学的指导&#xff0c;帮助孩子健康成长。 1. 身高发育的基本知…

BM11 链表相加(二)

描述 假设链表中每一个节点的值都在 0 - 9 之间&#xff0c;那么链表整体就可以代表一个整数。 给定两个这种链表&#xff0c;请生成代表两个整数相加值的结果链表。 数据范围&#xff1a;0≤&#x1d45b;,&#x1d45a;≤10000000≤n,m≤1000000&#xff0c;链表任意值 0≤…

前端面试:项目细节|项目重难点|已工作|做分享

面试官提问&#xff1a;分享一个项目中记忆比较深刻的需求&#xff1f;说说你是怎么解决的&#xff1f;解决过程有没有遇到什么困难&#xff1f; 答&#xff1a;我的回答&#xff08;我分点写思路&#xff0c;便于大家观看&#xff09;&#xff1a; &#xff08;1&#xff09…

C语言例题41、八进制转换为十进制

#include<stdio.h>void main() {int x;printf("请输入一个8进制整数&#xff1a;");scanf("%o", &x);printf("转换成十进制后的整数为%d\n", x); }运行结果&#xff1a; 本章C语言经典例题合集&#xff1a;http://t.csdnimg.cn/FK0Qg…

Web3时代的技术革新:区块链与人工智能的融合

随着科技的飞速发展&#xff0c;区块链和人工智能作为两大颠覆性技术正呈现出日益紧密的融合趋势。在Web3时代&#xff0c;这种融合将推动技术革新&#xff0c;引领着我们进入全新的数字时代。本文将深入探讨区块链与人工智能的融合&#xff0c;探索其在各个领域的应用前景和挑…

美国多IP服务器为企业的数据分析提供了强大的技术支持

美国多IP服务器为企业的数据分析提供了强大的技术支持 在当今数字化时代&#xff0c;数据分析已经成为企业决策和战略规划的核心。而美国多IP服务器则为企业提供了强大的技术支持&#xff0c;帮助它们有效地进行数据分析&#xff0c;从而更好地理解市场、优化运营&#xff0c;…

常见物联网面试题详解

物联网一直是非常火热的行业&#xff0c;G端如智慧城市、智慧工厂、智慧园区、智慧水利、智慧矿山等行业&#xff0c;都会涉及到物联网&#xff0c;基本都是软硬一体&#xff0c;因此当面试相关企业时&#xff0c;物联网平台是面试企业重点考察的项&#xff0c;小伙伴如果从事相…

十一、 进行个人信息保护认证的流程是怎样的?

2022 年 11 月 18 日&#xff0c;国家市场监督管理总局和国家网信办发布的《认证公告》以及附件《认证规则》&#xff0c;对开展个人信息保护认证的流程进行了细节说明&#xff0c;包括认证委托、技术验证、现场审核、认证结果评价和批准等环节。《认证公告》指出“从事个人信息…