代码随想录算法训练营第四天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点 、 面试题 02.07. 链表相交、142.环形链表II

24. 两两交换链表中的节点

在这里插入图片描述

题目链接: 24. 两两交换链表中的节点
文档讲解:代码随想录
状态:没做出来,没有正确更新头节点,因为head和cur共享引用,会随着cur的移动,丢失之前存放的节点

错误代码:

    public ListNode swapPairs(ListNode head) {
        ListNode cur = head;
        ListNode next;
        ListNode temp;

        while (cur != null && cur.next != null) {
            next = cur.next;
            temp = next.next;

            next.next = cur;
            cur.next = temp;

            cur = temp;
        }

        return head;

    }

思路:前面博客中总结过啥时候需要使用虚拟头结点,这边需要返回head节点,所以使用dummy节点,然后cur从dummy出发。

public ListNode swapPairs(ListNode head) {
    // 创建一个虚拟节点,dummy.next 指向 head
    ListNode dummy = new ListNode();
    dummy.next = head;

    // cur 用于遍历链表,初始化为 dummy 节点
    ListNode cur = dummy;
    ListNode first;   // 用于指向要交换的第一个节点
    ListNode second;  // 用于指向要交换的第二个节点
    ListNode temp;    // 用于暂存第二个节点的下一个节点

    // 当 cur 后面至少有两个节点时,继续交换
    while (cur.next != null && cur.next.next != null) {
        first = cur.next;          // 定位要交换的第一个节点
        second = cur.next.next;    // 定位要交换的第二个节点
        temp = second.next;        // 暂存第二个节点的下一个节点

        // 进行节点交换
        first.next = temp;         // 第一个节点的 next 指向第二个节点的 next
        second.next = first;       // 第二个节点的 next 指向第一个节点
        cur.next = second;         // 当前节点的 next 指向第二个节点

        // cur 移动到已交换的两个节点之后的位置
        cur = first;
    }

    // 返回新的头节点
    return dummy.next;
}

19.删除链表的倒数第N个节点

在这里插入图片描述

题目链接: 19.删除链表的倒数第N个节点
文档讲解:代码随想录
状态:so easy

思路:
看到“返回链表的头结点”,使用虚拟头结点dummy,删除倒数第N个节点就需要先找到它,然后对它进行操作。
方式1:遍历一遍得到len,然后倒数第n个节点就是len-n+1个节点。
方式2:利用栈,先所有节点入栈,然后出栈n个节点,此时栈顶元素就是倒数第N+1个节点,让它的next节点指向下下个节点即可。
方式3:利用双指针中的快慢指针,让fast指针先走n步,然后和slow指针同时移动,当fast指针指向null时,slow指针指向倒数第N=1个节点,让它的next节点指向下下个节点即可。

双指针题解

public ListNode removeNthFromEnd(ListNode head, int n) {
        // 创建一个虚拟节点,dummy.next 指向 head
        ListNode dummy = new ListNode();
        dummy.next = head;
        // 初始化快指针和慢指针都指向虚拟节点
        ListNode fast = dummy;
        ListNode slow = dummy;

        // 让快指针先移动 n 步
        while (n-- > 0 && fast.next != null) {
            fast = fast.next;
        }

        // 同时移动快指针和慢指针,直到快指针到达链表末尾
        while (fast.next != null) {
            fast = fast.next;
            slow = slow.next;
        }

        // 慢指针的下一个节点就是要删除的节点
        slow.next = slow.next.next;

        // 返回新的头节点
        return dummy.next;
    }

面试题 02.07. 链表相交

在这里插入图片描述

题目链接: 面试题 02.07. 链表相交(同160.链表相交)
文档讲解:代码随想录
状态:没做出来,一个bug卡了很久。

错误代码:

    // 在每一轮循环中,指针先移动到下一个节点,然后才判断是否为null并进行重定向。这会导致在指针都为null时直接重定向,而没有机会检查pointerA == pointerB是否成立,导致死循环。
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode pointerA = headA;
        ListNode pointerB = headB;

        while (pointerA != pointerB) {
            pointerA = pointerA.next;
            pointerB = pointerB.next;

            if (pointerA == null) {
                pointerA = headB;
            }
            if (pointerB == null) {
                pointerB = headA;
            }
        }
        return pointerA;
    }

思路1:可以使用HashMap,headA中的节点都存在map中,遍历headB时检查是否在map中存在该节点。如果存在,则这个节点就是交点
思路2:双指针。pA遍历headA,pB遍历headB,当pA遍历到尾部时,重定向到headB,当pB遍历到尾部时,重定向到headA,如果存在相同节点,则会两个指针在同一个节点相遇。

双指针题解:

   /**
     * 法二:双指针
     * 指针 pA和pB 指向同一个节点或者都为空时,返回它们指向的节点或者 null
     * <p>这边指向相同节点的是8,不是5也不是1哦,前面的5和1只是值相等,地址不等
     * 4 1 8 4 5#5 0 1 8 4 5
     * 5 0 1 8 4 5#4 1 8 4 5
     */
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        // 初始化两个指针,分别指向两个链表的头节点
        ListNode pA = headA;
        ListNode pB = headB;

        // 遍历两个链表,直到找到交点或者遍历结束
        while (pA != pB) {
            // 如果当前指针不为空,则移动到下一个节点;否则,重定向到另一个链表的头部
            pA = (pA != null) ? pA.next : headB;
            pB = (pB != null) ? pB.next : headA;
        }

        // 返回交点的节点,如果没有交点则返回null
        return pA;
    }

142.环形链表II

在这里插入图片描述

题目链接: 142.环形链表II
文档讲解:代码随想录
状态:还行

思路1:遍历head节点,用HashSet检查是否有出现过的同一节点,如果没有,就将遍历到的节点存入HashSet,否则返回的节点就是环的入口节点
思路2:数学方法+快慢指针

快慢指针题解

 // 使用快慢指针法找到单链表中的环的入口点
    public ListNode detectCycle(ListNode head) {
        // 初始化快慢指针,初始位置为链表头部
        ListNode fast = head, slow = head;
        // 防止空链表或者不存在环的情况
        while (true) {
            // 如果快指针或者快指针的下一个节点为null,说明不存在环,返回null
            if (fast == null || fast.next == null) {
                return null;
            }
            // 快指针每次移动两步,慢指针每次移动一步
            fast = fast.next.next;
            slow = slow.next;
            // 如果快慢指针相遇,说明存在环,跳出循环
            if (fast == slow) {
                break;
            }
        }
        // 将快指针重新指向链表头部,慢指针不变
        fast = head;
        /*当快慢指针再次相遇时,即为环的入口点
          这是因为在快慢指针相遇时,慢指针走过的距离(从链表头到环入口点的距离)与快指针走过的距离之间存在一定的关系。假设链表头到环入口点的距离为A,快慢指针相遇点距离环入口点的距离为B,环的周长为C。
          当快慢指针相遇时,快指针已经在环内绕了n圈,所以慢指针走的距离是(A+ B),而快指针走的距离是(A+B+nC)。
          由于快指针是慢指针的两倍速度,因此有关系:快指针走过的距离是慢指针的两倍。可以得到以下方程:
          A+B+nC=2(A+B)
          从而可以推导出:
          A= (n-1)C+(C-B)
          这意味着,将快指针重新指向链表头部,然后慢指针和快指针以相同的速度前进,它们将在环的入口点相遇。
          这是因为,慢指针走了n—1圈的环,再走C—B的距离就到达了环的入口点,
          而根据公式,同样的速度快指针从链表头步出发,此时刚好也走了距离A,此时两个指针在入口点相遇
         */
        while (slow != fast) {
            slow = slow.next;
            fast = fast.next;
        }
        // 返回环的入口点
        return fast;
    }

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

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

相关文章

腾讯发布ELLA:为扩散模型注入LLM能力,提升复杂场景的图像生成,准确率超90%

前言 近年来&#xff0c;基于扩散模型的文本到图像生成技术取得了显著进步&#xff0c;能够生成高质量、逼真的图像。然而&#xff0c;大多数扩散模型仍然使用CLIP作为文本编码器&#xff0c;这限制了它们理解复杂提示的能力&#xff0c;例如包含多个物体、详细属性、复杂关系…

摄像头应用测试

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

MySQL(一) 库和表的基础操作

1. 数据库基础 1.1 什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以下几个缺点&#xff1a; 文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便 数据库存储介质&#xff1a;磁盘内存 为了解…

学 C/C++ 具体能干什么?

学习 C 和 C 后&#xff0c;你可以从事许多不同的工作和项目&#xff0c;这两种语言以其高性能和低级控制而闻名&#xff0c;特别适合以下几个领域&#xff1a; 1. 系统编程 C 和 C 是系统编程的首选语言&#xff0c;适用于操作系统、驱动程序和嵌入式系统开发。 操作系统开发…

PgMP:项目集管理,哪些人适合学习?

美国项目管理协会&#xff08;PMI&#xff09;对项目集经理&#xff08;Program Manager&#xff09;的角色做出如下的定义&#xff1a; 在最少的领导/监督下&#xff0c;项目集经理PgMP负责在商业和组织目的下协调管理多个相关项目。这些项目含有跨部门、组织、地理区域…

【kubernetes】探索k8s集群中金丝雀发布后续 + 声明式资源管理yaml

目录 一、K8S常见的发布方式 1.1蓝绿发布 1.2灰度发布&#xff08;金丝雀发布&#xff09; 1.3滚动发布 二、金丝雀发布 三、声明式管理方法 3.1YAML 语法格式 3.1.1查看 api 资源版本标签 3.1.2查看资源简写 3.2YAML文件详解 3.2.1Deployment.yaml 3.2.2Pod.yaml …

国际版Tiktok抖音运营流量实战班:账号定位/作品发布/热门推送/等等-13节

课程目录 1-tiktok账号定位 1.mp4 2-tiktok作品发布技巧 1.mp4 3-tiktok数据功能如何开通 1.mp4 4-tiktok热门视频推送机制 1.mp4 5-如何发现热门视频 1.mp4 6-如何发现热门音乐 1.mp4 7-如何寻找热门标签 1.mp4 8-如何寻找垂直热门视频 1.mp4 9-如何发现热门挑战赛 1…

【C语言回顾】编译和链接

前言1. 编译2. 链接结语 上期回顾: 【C语言回顾】文件操作 个人主页&#xff1a;C_GUIQU 归属专栏&#xff1a;【C语言学习】 前言 各位小伙伴大家好&#xff01;上期小编给大家讲解了C语言中的文件操作&#xff0c;接下来我们讲解一下编译和链接&#xff01; 1. 编译 预处理…

C++11 线程库

C11 线程库 一.thread类1.介绍1.框架2.构造3.赋值4.join与joinable5.id和get_id6.this_thread命名空间7.yield8.演示 二.锁类1.互斥锁1.介绍2.使用1.配合lambda来使用2.ref 2.递归锁和时间锁1.递归锁介绍2.例子3.时间锁介绍 三.RAII管理锁类1.lock_guard1.介绍2.使用3.好处与不…

AOP总结

AOP是什么 AOP是面向切面编程&#xff0c;其目的是将横切关注点从核心业务代码中分离出来&#xff0c;通过动态代理等方式&#xff0c;实现代码的增强和解耦&#xff0c;使得其具有更好的可维护性和可扩展性。 其中横切关注点是多个类或对象的公共行为&#xff0c;如事务管理…

五种独立成分分析(ICA)

代码原理及流程 代码实现了混合信号的独立成分分析&#xff08;ICA&#xff09;过程&#xff0c;主要包括以下几个步骤&#xff1a; 原始语音信号读取与显示&#xff1a;首先读入原始的两个语音信号(music.wav和man.wav)&#xff0c;并显示在图中的第一和第二个子图中。混合声…

mfc140.dll丢失原因和mfc140.dll丢失修复办法分享

mfc140.dll是与微软基础类库&#xff08;Microsoft Foundation Classes, MFC&#xff09;紧密相关的动态链接库&#xff08;DLL&#xff09;文件。MFC是微软为C开发者设计的一个应用程序框架&#xff0c;用于简化Windows应用程序的开发工作。以下是mfc140.dll文件的一些关键属性…

项目管理:敏捷实践框架

一、初识敏捷 什么是敏捷(Agile)?敏捷是思维方式。 传统开发模型 央企,国企50%-60%需求分析。整体是由文档控制的过程管理。 传统软件开发面临的问题: 交付周期长:3-6个月甚至更长沟通效果差:文档化沟通不及时按时发布低:技术债增多无法发版团队士气弱:死亡行军不关注…

如何安装虚拟机Wmware,并且在虚拟机中使用centos系统

1. 前言 大家好&#xff0c;我是jiaoxingk 本篇文章主要讲解如何安装虚拟机&#xff0c;并且在虚拟机中安装centos系统&#xff0c;让windows电脑也能够使用Linux系统 2. 虚拟机的介绍 在安装Vmware之前&#xff0c;我们先做虚拟机的介绍 虚拟机&#xff1a;通过软件虚拟出来的…

20240523每日运维--------聊聊docker简介(一)

dotCloud 说Docker&#xff0c;必不可免不得不说dotCloud&#xff0c;Docker本来只是dotCloud公司的内部项目&#xff0c;其公司创始人 Solomon Hykes 发了一个内部项目&#xff0c;而这个项目就是Docker&#xff0c;自从2013年docker开源以后&#xff0c;在世界范围引起相当轰…

服务器安全审计: chkrootkit 和 rkhunter 详解

chkrootkit 和 rkhunter 是两个广泛使用的安全工具,用于检测系统是否被Rootkit或其他恶意软件感染。本文将详细说明这两个工具的使用方法及如何解释检测结果。 1. chkrootkit 1.1. 安装 chkrootkit 在CentOS上安装 chkrootkit 可以使用以下命令: yum install chkrootkit -…

十四天学会Vue——Vue核心(理论+实战)(第一天)上篇

&#xff01;&#xff01;&#xff01;声明必看&#xff1a;由于本篇开始就写了Vue&#xff0c;内容过多&#xff0c;本篇部分内容还有待完善&#xff0c;小编先去将连续更新的js高阶第四天完成~本篇部分待完善内容明日更新 一、Vue核心&#xff08;上篇&#xff09; 热身top…

【机器学习300问】97、机器学习中哪些是凸优化问题,哪些是非凸优化问题?

在机器学习的领域中&#xff0c;多数模型的参数估计问题实质上可以转化为优化问题。鉴于机器学习模型的多样性&#xff0c;不同的模型会对应着不同的损失函数&#xff0c;进而形成各具特色的优化问题。了解优化问题的形式和特点&#xff0c;对于提升我们求解模型参数的效率和准…

Meta发布Chameleon模型预览,挑战多模态AI前沿

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

(已开源-ICRA2023) High Resolution Point Clouds from mmWave Radar

本文提出了一种用于生成高分辨率毫米波雷达点云的方法&#xff1a;RadarHD&#xff0c;端到端的神经网络&#xff0c;用于从低分辨率雷达构建类似激光雷达的点云。本文通过在大量原始雷达数据上训练 RadarHD 模型&#xff0c;同时这些雷达数据有对应配对的激光雷达点云数据。本…