图解LeetCode链表题

news2025/7/9 8:23:43

💐文章导读

本篇文章主要详细的用图解的方式为大家讲解了简单程度的链表题,如果题中有错误的地方,还麻烦您在评论区指出,你的意见就是我最大的进步!!!

💐专栏导读

🤴作者:🦁努力努力再努力

🏆文章专栏:🌷《JavaSE语法》 、 🌷《C语言初阶》、 🌷《图解LeetCode》、 🌺《数据结构剖析》

文章目录

  • 💐文章导读
  • 💐专栏导读
  • 1、环形链表
  • 2.环形链表进阶版
  • 3.相交链表
  • 4.删除排序链表中的重复元素
  • 5.移除重复节点
  • 6.删除中间节点
  • 7.二进制链表转整数
  • 9.翻转链表
  • 10.链表中倒数第K个结点
  • 11.从头到尾打印链表

1、环形链表

思路:本体主要是利用双指针进行解题,分别定义一个快指针和慢指针,快指针一次走两步,慢指针一次走一步,如果链表有环的情况下,快慢指针直接差的距离最多是一个环的距离,肯定不会超过一个环,所以就需要用一个循环让快慢指针分别走,当两个指针相遇时,就返回true,就表明链表有环,如果循环结束了还没有返回,就表明链表没环,而循环结束的条件就是fast==null || fast.next == null时,表明链表已经走完了。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.环形链表进阶版

在这里插入图片描述

在这里插入图片描述

    public ListNode detectCycle(ListNode head) {
        if(head == null) {
            return null;
        }
        ListNode fast = head;
        ListNode slow = head;
        while(fast!=null && fast.next!=null) {//查找在环中相遇时的节点
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow){
                break;
            }
        }
        if( fast==null || fast.next==null) {
            return null;
        }
        fast = head;
        while(fast != slow){
            fast = fast.next;
            slow = slow.next;
        }
        return fast;
    }

3.相交链表

在这里插入图片描述

思路:

如果要求两个链表的在什么地方相交,就要从两个链表的同一个节点向后遍历,所以首先要算出两个链表的长度差,让长的链表向后先走差值步,然后两个链表再一起向后走,直到遇见相同的地址处!

下面有图解:

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
                //1、分别求2个链表的长度
            int lenA = 0;
            int lenB = 0;
            int len = 0;
            ListNode curA = headA;
            ListNode curB = headB;
            while(curA != null) {
                lenA++;
                curA = curA.next;
            }
            while(curB != null) {
                lenB++;
                curB = curB.next;
            }
            curA = headA;
            curB = headB;
            len = lenA-lenB;
            if(len<0) {
              curA = headB;
              curB = headA;
              len = lenB-lenA;
            }
            for(int i=0; i<len; i++) {
                curA = curA.next;
            }
            while(curA!= null && curB!=null) {
                if(curA == curB){
                    return curA;
                }
                 curA = curA.next;
                curB = curB.next;
            } 
            return null;
    }

在这里插入图片描述

在这里插入图片描述

4.删除排序链表中的重复元素

在这里插入图片描述

在这里插入图片描述

5.移除重复节点

在这里插入图片描述

双指针解法:
定义一个cur1指向头节点,再定义一个cur2指向cur1,用cur2区遍历所有的节点中val值与cur1中的val值作对比,如果相同就删除,否则就一直遍历

  public ListNode removeDuplicateNodes(ListNode head) {
        if(head == null) {
            return null;
        }
        ListNode cur1 = head;
        while(cur1 != null){
            ListNode cur2 = cur1;
            while(cur2.next != null){
                if(cur2.next.val == cur1.val) {
                    cur2.next = cur2.next.next;
                }else{
                    cur2 = cur2.next;
                }
            }
            cur1 = cur1.next;
        }
        return head;
    }

在这里插入图片描述

6.删除中间节点

在这里插入图片描述

解题思路:

要删除中间节点的话本来应该要找到中间节点的前驱的,但是现在只给了中间节点,那么可以这样做,可以把中间节点的后继节点中的val值赋给中间节点的val值,然后把后继节点删除掉,这样也符合题目要求

 public void deleteNode(ListNode node) {
        node.val = node.next.val;
        node.next = node.next.next;
    }

7.二进制链表转整数

在这里插入图片描述

   //第一种方法:利用按位或
public int getDecimalValue(ListNode head) {
        int ans = 0;
        ListNode cur = head;
        while(cur != null) {
            ans  = ans<<1;
            ans |= cur.val;
            cur = cur.next;
        }
        return ans;
    }
//第二种方法:利用换算二进制方法
       public int getDecimalValue(ListNode head){
           ListNode cur = head;
           int ans = 0;
           while(cur != null) {
               ans = ans*2+cur.val;
               cur = cur.next;
           }
           return ans;
       }

在这里插入图片描述

9.翻转链表

在这里插入图片描述

解题思路:

1、翻转链表就是将后面的每一个节点都存储前面一个节点的地址

2、因为链表都是从前向后走的,如果想要让后一个节点cur中的next变成前一个节点的地址,就需要知道前一个节点的地址;所以需要用一个变量prev来记录前一个结点,再用一个变量next来记录第三个结点,以方便中间的节点向后走,不然的话,当中间节点内的next改变以后,没办法找到第三个节点的位置,然后三个记录节点的变量分别向后走,这样知道前面一个节点和后面一个节点,就可以进行翻转!

   public ListNode reverseList(ListNode head) {
        if(head == null) {
            return null;
        }
        ListNode curprev = null;
        ListNode cur = head;
        while(cur != null) {
            ListNode next = cur.next;
            cur.next = curprev;
            curprev = cur;
            cur = next;
        }
        head = curprev;
        return head;
    }

10.链表中倒数第K个结点

在这里插入图片描述

解题思路:

1、求链表中倒数第K个结点,应该思考当给过k之后,应该怎么找这个倒数第k个节点,就拿题中给的事例来说,求倒数第二个结点就是4,可以用快慢指针的方法,而快慢指针的概念就是,假如有两个人A和B,它们都距离目的地差10步,如果让A先提前走三步,那么A和B之间就会差三步,然后让A和B在一人一步走,这样当A走到目的地时,B还是和A差三步远,而这个B正好在倒数第三个位置。路程不同,时间相同,速度相同,最后得到的就是路程差

所以此题定义一个fast快指针和slow慢指针,让快指针先走k步,当快指针走到空时,满指针正好在倒数第k的位置

 public ListNode getKthFromEnd(ListNode head, int k) {
        if(head == null) {
            return null;
        }
        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;
    }

11.从头到尾打印链表

在这里插入图片描述

解题方法:

1、先计算链表的长度,作为数组的长度

2、判断链表是否为空,为空则数组也为空,返回空数组

3、从数组的最后的下标开始放链表中的val

    public int[] reversePrint(ListNode head) {
        int len = 0;
        ListNode cur = head;
        //计算链表的长度
        while(cur!=null){
            len++;
            cur = cur.next;
        }
        int[] arr = new int[len];
        //如果链表为空则返回空数组
        if(head == null) {
            return arr;
        }
        因为数组下标是从0开始的所以减一
        int i =len-1;
        cur = head;
        while(cur!=null) {
            //从数组的最后开始放
            arr[i--] = cur.val;
            cur = cur.next;
        }
        return arr;
    }

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

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

相关文章

什么是数字化?企业为什么要数字化转型

一、什么是数字化&#xff1f; 什么是数字化&#xff1f;在我理解&#xff0c;数字化是一个基于时代科技发展所产生的概念&#xff0c;首先它是一个工具&#xff0c;在企业的经营发展中将信息技术融入到传统的企业模式中&#xff0c;起到了转型的作用。 其次数字化转型是企业…

国产易灵思FPGA的FIFO应用详解

一、软件设置界面 FIFO&#xff08;First In First Out&#xff0c;即先入先出&#xff09;&#xff0c;是一种数据缓冲器&#xff0c;用来实现数据先入先出的读写。与 ROM 或 RAM 的按地址读写方式不同&#xff0c; FIFO 的读写遵循“先进先出”的原则&#xff0c;即数据按顺…

关于this->moveToThread(this)——QtWidgets

前言 官方关于QThread的用法有两种&#xff1a;一是子类QThread&#xff0c;并重新实现run&#xff1b;二是使用QObject::MoveToThread&#xff0c;通过信号槽在不同的线程内通信。 最近看到了一种写法&#xff0c;就是将两者融合就是子类QThread&#xff0c;然后this->mo…

【小程序】封装时间选择组件:用单元格van-cell和插槽slot,包括起始时间和终止时间

效果 可以选择起始时间和终止时间&#xff0c;并显示。 时间选择器放在van-cell的value插槽中。 用的库&#xff1a; https://vant-contrib.gitee.io/vant-weapp/#/home https://dayjs.fenxianglu.cn/category/ 用的组件&#xff1a;Cell单元格、DatetimePicker时间选择、Pop…

【Unity编辑器扩展】(二)PSD转UGUI Prefab, 图层解析和碎图导出

书接上回&#xff1a;【Unity编辑器扩展】(一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用_TopGames的博客-CSDN博客 工具使用预览&#xff1a; 工具目标&#xff1a; 1. 实现将psd解析生成为UI预制体&#xff0c;并导出UI图片。需支持UGUI和TextMeshProGUI, 如Button、To…

文心一言 VS 讯飞星火 VS chatgpt (22)-- 算法导论4.2 2题

二、为Strassen算法编写伪代码。 文心一言&#xff1a; Strassen算法是一种用于矩阵乘法的算法&#xff0c;它的核心思想是通过不断将原始矩阵分割成较小的子矩阵来实现高效的乘法运算。以下是Strassen算法的伪代码&#xff1a; function Strassen(A, B): if A[0][0] 0 or…

优化|数学软件是如何求解线性方程Ax=b ?

编者按 对于大家来说&#xff0c;我们从学会多项式开始就得和求解矩阵方程打交道。大学之前靠手算&#xff0c;到了大学阶段我们学会了使用科学计算软件&#xff0c;然后只需要输入简单的一行指令 x A \ b x A \backslash b xA\b&#xff0c;就可以轻轻松松求解方程组 A x …

html实现酷炫科技风大屏风格模板(附源码)

文章目录 1.设计来源1.1 大屏主界面1.2 弹框界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/130870963 html实现酷炫科技风大屏风格模板源码 &#xff0c;html大屏源码…

docker容器postgres数据导出命令及还原数据命令

参考资料 docker控制postgers容器导入导出数据_docker 导出数据库_奔跑的痕迹的博客-CSDN博客 --进入容器 docker exec -it 容器名称或容器id /bin/bash 以下命令是在进入容器执行的 --导出单张表的备份语句&#xff08;copy模式&#xff09; pg_dump -h 127.0.0.1 -U …

授权管理再工控安全中起到什么作用?

随着计算机技术、通信技术和控制技术的发展&#xff0c;工业自动化控制已经开始向网络化方向发展&#xff0c;从最初的CCS&#xff08;计算机集中控制系统&#xff09;&#xff0c;到第二代的DCS&#xff08;分散控制系统&#xff09;&#xff0c;发展到现在流行的FCS&#xff…

力扣 1775.通过最少操作次数使数的和相等、1014.最佳观光组合、33.搜索旋转排序数组

算法总结 最近作者在坚持每日一道中等难度算法题&#xff0c;也是作者考核时经常会碰到的难度&#xff0c;由于经常是到22:30才意识到自己并没有写算法&#xff0c;因此都是打开LeetCode网站随机一题&#xff0c;并未系统性的去学习&#xff0c;这一点值得反思。在做题过程中经…

航天科技AIRIOT物联会【智慧物联主题沙龙】在沈阳举办

2023年5月24日&#xff0c;由航天科技控股集团股份有限公司&#xff08;简称“航天科技”&#xff09;智慧物联事业部主办的《AIRIOT物联会-智慧物联主题分享沙龙》在沈阳举办&#xff0c;此次会议邀请到来自光伏、燃气、能源、水务、园区、工厂等行业的众多企业代表参加&#…

0起步用GPT+知乎赚了点小钱,人人可复制

大家好&#xff0c;我是五竹。 前段时间分享了一篇关于用ChatGPT赚点小钱的实战&#xff1a;TMD&#xff0c;被人偷窥了一个月&#xff01;结果上周末的时候在知乎追了一个关于Claude的热点&#xff0c;发布了一篇注册Claude的文章&#xff0c;结果小小的“爆了”一下&#xf…

Qt文件系统源码分析—第五篇QTemporaryFile

深度 本文主要分析Windows平台&#xff0c;Mac、Linux暂不涉及 本文只分析到Win32 API/Windows Com组件/STL库函数层次&#xff0c;再下层代码不做探究 本文QT版本5.15.2 类关系图 QTemporaryFile继承QFile QFile、QSaveFile继承QFileDevice QFileDevice继承QIODevice Q…

如何查看一个 docker 镜像有哪些版本

如何查看一个 docker 镜像有哪些版本 因为通过 docker search 并不能查看某个镜像的版本信息&#xff0c;如我需要特定版本的 redis 那怎么办呢~ 本文提供了如下几种方式&#xff0c;大家可以分别逐个尝试下~ 为什么有几种方式呢&#xff0c;因为官方的查找镜像网址 Docker H…

使用audition测试USBaudio数据回传延时

一&#xff0c;简介 本文主要介绍如何使用Audition软件来测试STM32 USB audio上行音频数据的延时。 二&#xff0c;准备工作 Audition&#xff0c;ASIO驱动&#xff0c;STM32枚举的USB Audio高速声卡测试板。 二&#xff0c;硬件连接 将STM32的IIS的data in和data out使用…

四款AI视频翻译产品横评

本文内容节选自 Paxi.ai 的文章分享&#xff0c;从其中摘录了我觉得有意思的一部分。Paxi.ai 是一个基于 GPT-4 打造的帮用户快速使用AI的AI工具&#xff0c;通过与它的小助手对话可以了解各种AI的产品功能和使用方式。对本文内容感兴趣的朋友可以上他们官网查看。 有没有想过把…

go embed 实现gin + vue静态资源嵌入

前言 golang1.16出来以后&#xff0c;早就有打算把ckman项目的前端代码打包更换成embed。在此之前&#xff0c;使用的是pkger进行的打包。 但是今天打包时却报了个错&#xff1a; 而且通过各种手段尝试均无果之后&#xff0c;果断把决定立即将其更换为embed进行资源嵌入管理。…

华为OD机试真题 Java 实现【寻找符合要求的最长子串】【2023Q1 200分】

一、题目描述 给定一个字符串 s &#xff0c;找出这样一个子串&#xff1a; 该子串中的任意一个字符最多出现2次&#xff1b;该子串不包含指定某个字符&#xff1b; 请你找出满足该条件的最长子串的长度。 二、输入描述 第一行为要求不包含的指定字符&#xff0c;为单个字…

一个神奇的工具,让URL地址都变成了“ooooooooo“

一个神奇的工具&#xff0c;让URL地址都变成了"ooooooooo" 一、核心代码二、URL编码/解码 最近发现一个有意思工具&#xff0c;就是将一个URL地址转换为都是 ooooooooo 的样子&#xff0c;通过转换后的地址访问可以转换回到原始地址&#xff0c;转换的逻辑有点像短链…