【代码随想录算法训练营-第四天】【链表】24,19, 面试题 02.07,142

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

第一遍-递归-小看了一下题解

  • 思路:
    • 读了两遍题目才理解…
    • 相邻节点的交换,这个操作很容易实现,但需要一个tmpNode
    • 因为是链表的题目,没开始思考之前先加了dummyNode,还真管用
    • dummyNode作为了最后返回用的,以及新增preNode作为tmpNode
    • 用递归写是因为不想用循环了…感觉递归写起来好玩一些
    • 小看了一下题解的地方:(其实再给自己多一些debug的次数应该也能试出来)
      • 递归结束条件:|| i.next.next == null这个没有想出来
/*
* 这部分是自己在Idea上写的,用了之前的题目实现的MyLinkedList
* 感觉这样会比在力扣上面写更能熟悉链表一些,而且debug更容易一些
* */
package LinkList;public class Linklist_test {public static void main(String[] args) {MyLinkedList myLinkedList = new MyLinkedList();
//        myLinkedList.addAtHead(4);myLinkedList.addAtHead(3);myLinkedList.addAtHead(2);myLinkedList.addAtHead(1);LinklistSolution solution = new LinklistSolution();ListNode head = solution.swapPairs(myLinkedList.dummy.next);for (; head != null; head = head.next) {System.out.println(head.val);}}
}class LinklistSolution {public ListNode reverseDouble(ListNode head, ListNode preNode, ListNode i, ListNode j) {// 交换节点preNode.next = i.next;i.next = j.next;j.next = i;if (i.next == null || i.next.next == null) return head.next;// 移动节点j = i.next.next;i = i.next;preNode = preNode.next.next;return reverseDouble(head, preNode, i, j);}public ListNode swapPairs(ListNode head) {if (head == null || head.next == null) return head;ListNode dummy = new ListNode(-1);dummy.next = head;ListNode preNode = dummy;ListNode i = head;ListNode j = head.next;return reverseDouble(dummy, preNode, i, j);}
}
  • 看了一下代码随想录Java的递归题解,嗯,真🐂,我想不出来
    • 示例代码很好的利用了链表是通过指向下一个节点的地址链接的,所以返回newNode可以实现;
// 示例代码
class LinklistSolution {public ListNode swapPairs(ListNode head) {// base case 退出提交if(head == null || head.next == null) return head;// 获取当前节点的下一个节点ListNode next = head.next;// 进行递归ListNode newNode = swapPairs(next.next);// 这里进行交换next.next = head;head.next = newNode;return next;}
}

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

第一遍

  • 思路:
    • 这一题误操作了,忘记先自己想了,直接看题解了…
    • 算是两遍AC吧,第一次fast指针的循环没控制好
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy = new ListNode(-1);dummy.next = head;if (head.next == null) {return head.next;}ListNode slow = dummy;ListNode fast = dummy;for (int i = 0; i <= n; i++) {fast = fast.next;}for (; fast != null; fast = fast.next) {slow = slow.next;// fast = fast.next; 第一次提交的时候多写了一个这个,debug的时候才发现不对}slow.next = slow.next.next;return dummy.next;}
}

面试题 02.07. 链表相交

第一遍

  • 思路:
    • 读了第一遍直接写了,第一次开始写循环又出错了…而且出了两个错误
      • 错误1:判断条件写成了A.next != null,导致所有的链表长度都-1,长度为1且相交的时候会有问题;
      • 错误2:没有写A = A.next的修改条件;
    • 第一遍写完,使用的是A.val = B.val的判断条件,不对,发现有val相等,但是答案并不是对应指针;
    • 麻了,又去看题,看了n遍都没看懂;
    • 最后看了题解,结果发现是指针相等(怎么从题中读出的指针相等的?)
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if (headA == null || headB == null) {return null;}ListNode A = headA;ListNode B = headB;int lenA = 0, lenB = 0;while (A != null) {lenA++;A = A.next;}while (B != null) {lenB++;B = B.next;}A = headA;B = headB;int n = lenA >= lenB ? lenA - lenB : lenB - lenA;int m = lenA >= lenB ? lenB : lenA;if (lenA > lenB) {while (n > 0) {A = A.next;n--;}} else {while (n > 0) {B = B.next;n--;}}while (m > 0) {if (A == B) {return A;}A = A.next;B = B.next;m--;}return null;}
}

142.环形链表II

第一遍-看题解后一遍过

  • 思路:
    • 20mins的思考,想到了slowNode每次+1,fastNode每次+2;
    • 但这样单纯的移动,会导致两个点相遇的时候不在入口,答案错误;
    • 最后还是看了题解,感觉不太能想得出来;
public class Solution {public ListNode detectCycle(ListNode head) {if (head == null || head.next == null) {return null;}ListNode fastNode = head;ListNode slowNode = head;while (fastNode != null && fastNode.next != null) {slowNode = slowNode.next;fastNode = fastNode.next.next;if (fastNode == slowNode) {while (head != fastNode) {head = head.next;fastNode = fastNode.next;}return head;}}return null;}
}

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

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

相关文章

空气质量数据和气象数据

1、北京、上海、广州的空气质量数据和气象数据 要素如下&#xff1a; 逐日数据 时间跨度&#xff1a;2014.1.1-2022.3.31&#xff0c;共3012条数据 数据质量&#xff1a;98% 城市&#xff1a;只有北京、上海、广州 可以用作论文数据 数据来源&#xff1a;中国环境监测总站…

23. 合并 K 个升序链表 --力扣 --JAVA

题目 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 解题思路 对每个链表的首节点进行比较&#xff0c;获取当前的最小节点&#xff1b;将每个阶段的最小节点进行链接&#xff1b; 代码展示 c…

亚马逊云科技re_Invent 2023产品体验:亚马逊云科技产品应用实践 国赛选手带你看Elasticache Serverless

抛砖引玉 讲一下作者背景&#xff0c;曾经参加过国内世界技能大赛云计算的选拔&#xff0c;那么在竞赛中包含两类&#xff0c;一类是架构类竞赛&#xff0c;另一类就是TroubleShooting竞赛&#xff0c;对应的分别为AWS GameDay和AWS Jam&#xff0c;想必也有朋友玩过此类竞赛&…

4.权限特权转移代码

核心文件用户文件引导文件 核心文件 ;------------------------新增--------------------------------; 本文件涉及了权限, 将使用调用门描述符来处理 低权限到高权限的转移;------------------------权限---------------------------- ;此文件延用上个CORE.asm. 并做出一些修…

[linux] 解压缩xz

在Linux命令行中解压缩.xz文件&#xff0c;你可以使用以下几种方法&#xff1a; 使用unxz工具&#xff1a; unxz filename.xz 这个命令会将filename.xz解压缩为一个同名的未压缩文件。如果原文件有其他的扩展名&#xff08;如.tar.xz&#xff09;&#xff0c;那么这个扩展名会被…

关于洛谷P1007最快的方法

P1007 独木桥 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目背景 战争已经进入到紧要时间。你是运输小队长&#xff0c;正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激&#xff0c;于是命令你的士兵们到前方的一座独木桥上欣赏风景&#xf…

智能仪表板DevExpress Dashboard v23.1 - 支持自定义样式创建

使用DevExpress Analytics Dashboard&#xff0c;再选择合适的UI元素&#xff08;图表、数据透视表、数据卡、计量器、地图和网格&#xff09;&#xff0c;删除相应参数、值和序列的数据字段&#xff0c;就可以轻松地为执行主管和商业用户创建有洞察力、信息丰富的、跨平台和设…

STM32 配置TIM定时中断常用库函数

单片机学习&#xff01; 目录 ​编辑 1. 函数TIM_DeInit 2. 函数TIM_TimeBaseInit 配置时基单元 3. 函数TIM_TimeBaseStructInit 4. 函数TIM_Cmd 运行控制 5. 函数TIM_ITConfig 中断输出控制 6. 时基单元的时钟选择函数 6.1 函数TIM_InternalClockConfig 6.2 函数 TIM…

Configuring environment||ROS2环境配置

Goal: This tutorial will show you how to prepare your ROS 2 environment. Tutorial level: Beginner Time: 5 minutes ROS 2 relies on the notion &#xff08;concept&#xff09;of combining workspaces using the shell environment. “Workspace” is a ROS term …

C++进阶篇8---智能指针

一、引言 为什么需要智能指针&#xff1f; 在上一篇异常中&#xff0c;关于内存释放&#xff0c;我们提到过一个问题---当我们申请资源之后&#xff0c;由于异常的执行&#xff0c;代码可能直接跳过资源的释放语句到达catch&#xff0c;从而造成内存的泄露&#xff0c;对于这种…

C# Winform 日志系统

目录 一、效果 1.刷新日志效果 2.单独日志的分类 3.保存日志的样式 二、概述 三、日志系统API 1.字段 Debug.IsScrolling Debug.Version Debug.LogMaxLen Debug.LogTitle Debug.IsConsoleShowLog 2.方法 Debug.Log(string) Debug.Log(string, params object[]) …

数据结构之内部排序

目录 7-1 直接插入排序 输入格式: 输出格式: 输入样例: 输出样例: 7-2 寻找大富翁 输入格式: 输出格式: 输入样例: 输出样例: 7-3 PAT排名汇总 输入格式: 输出格式: 输入样例: 输出样例: 7-4 点赞狂魔 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&a…

RabbitMQ在国内为什么没有那么流行?

MQ&#xff08;消息队列&#xff09;的世界。MQ&#xff0c;就像是一个巨大的邮局&#xff0c;负责在不同服务或应用间传递消息。它可以帮助我们解耦系统&#xff0c;提高性能&#xff0c;还能做到异步处理和流量削峰。 基本使用 RabbitMQ是一个开源的消息代理和队列服务器&a…

spring boot + uniapp 微信公众号 jsapi 支付

后端支付类 package com.ruoyi.coupon.payment;import com.google.gson.Gson; import com.ruoyi.coupon.payment.dto.PayParamJsapiDto; import com.ruoyi.coupon.payment.dto.RefundParam; import com.ruoyi.coupon.service.ICouponConfigService; import com.wechat.pay.jav…

FFmpeg抽取视频h264数据重定向

根据视频重定向技术解析中的 截获解码视频流的思路&#xff0c;首先需要解决如何输出视频码流的问题。 目前只针对h264码流进行获取&#xff0c;步骤如下&#xff1a; 打开mp4文件并创建一个空文件用于存储H264数据 提取一路视频流资源 循环读取流中所有的包(AVPacket),为…

redis中使用pipeline批量处理请求提升系统性能

在操作数据库时&#xff0c;为了加快程序的执行速度&#xff0c;在新增或更新数据时&#xff0c;可以通过批量提交的方式来减少应用和数据库间的传输次数&#xff1b;在redis中也有这样的技术实现批量处理&#xff0c;也就是管道——Pipeline。它也是通过批量提交数据的方式来实…

线程安全3--wait和notify

文章目录 wait and notify&#xff08;等待通知机制notify补充 wait and notify&#xff08;等待通知机制 引入wait notify就是为了能够从应用层面上&#xff0c;干预到多个不同线程代码的执行顺序&#xff0c;这里说的干预&#xff0c;不是影响系统的线程调度策略&#xff08…

uni-app应用设置 可以根据手机屏幕旋转进行 (横/竖) 屏切换

首先 我们打开项目的 manifest.json 在左侧导航栏中找到 源码视图 然后找到 app-plus 配置 在下面加上 "orientation": [//竖屏正方向"portrait-primary",//竖屏反方向"portrait-secondary",//横屏正方向"landscape-primary",//横屏…

第57天:django学习(六)

模版之过滤器 语法&#xff1a; {{obj|filter__name:param}} 变量名字|过滤器名称&#xff1a;变量 default 如果一个变量是false或者为空&#xff0c;使用给定的默认值。否则&#xff0c;使用变量的值。例如&#xff1a; {{ value|default:"nothing"}} length …

IDEA启动应用时报错:错误: 找不到或无法加载主类 @C:\Users\xxx\AppData\Local\Temp\idea_arg_filexxx

IDEA启动应用时报错&#xff0c;详细错误消息如下&#xff1a; C:\devel\jdk1.8.0_201\bin\java.exe -agentlib:jdwptransportdt_socket,address127.0.0.1:65267,suspendy,servern -XX:TieredStopAtLevel1 -noverify -Dspring.output.ansi.enabledalways -Dcom.sun.management…