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

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

这道题的关键在于:
1、在置换两个节点的时候,当前节点需要在这俩节点之前一个节点。并且要提前保存cur.next以及cur.next.next。
2、每次置换完一组节点,cur = cur.next.next
3、判断结束的标志:奇数个节点:cur.next.next != null 偶数个节点:cur.next != null 为了保证cur.next.next不会产生空指针,需要先判断next != null
4、最终返回的是虚拟节点的下一个节点,因为最初的head节点已经不在链表最前面了
具体步骤如下:
在这里插入图片描述

dummyNode.next = head;//对于0、1节点,需要创建一个虚拟节点.
ListNode temp1 = cur.next;
ListNode temp2 = cur.next.next.next;//并保存temp1和temp2.

①②③步骤按序进行
①cur.next = cur.next.next;
②cur.next.next = temp1;
③ temp1.next = temp2;
在这里插入图片描述
cur = cur.next.next;

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode swapPairs(ListNode head) {ListNode dummyNode = new ListNode();dummyNode.next = head;ListNode cur = dummyNode;while(cur.next != null && cur.next.next != null){ListNode temp1 = cur.next;ListNode temp2 = cur.next.next.next;cur.next = cur.next.next;cur.next.next = temp1;temp1.next = temp2;cur = cur.next.next;}return dummyNode.next;}
}

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

法一:遍历链表得出链表长度length,用length - n定位要删除的节点,缺点是需要第二次遍历链表
代码:

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {int length = 0;ListNode dummyNode = new ListNode();dummyNode.next = head;ListNode cur = dummyNode;while(cur.next != null){length++;cur = cur.next;}ListNode cur2 = dummyNode;for(int i = 0;i < length - n;i++){cur2 = cur2.next;}cur2.next = cur2.next.next;return dummyNode.next;}
}

法二:让快指针先走n步,然后快慢指针同时走。
这个思想很巧妙也很好理解,关键是临界值的设定很容易出错,可以用只有一个节点的链表删除倒数第一个节点的特殊情况去写临界值。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummyNode = new ListNode();dummyNode.next = head;ListNode fast = dummyNode;ListNode slow = dummyNode;for(int i = 0;i < n-1;i++){fast = fast.next;}//假设只有一个节点的链表要删除倒数第一个节点,n=1,此时快慢节点不需要中间有差值,slow和fast都指向dummyNodewhile(fast.next.next != null){fast = fast.next;slow = slow.next;}//因为fast.next.next == null,fast和slow都不需要往下移动slow.next = slow.next.next;//删除第一个节点return dummyNode.next;}
}

或者这样也可以:
这俩区别在于如果在
for(int i = 0;i < n;i++){
fast = fast.next;
}中i移动的条件为这个,fast为向下移动一位。那么响应的下面
while(fast.next != null){
fast = fast.next;
slow = slow.next;
}中while的判定条件由fast.next.next!= null变为fast.next != null

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummyNode = new ListNode();dummyNode.next = head;ListNode fast = dummyNode;ListNode slow = dummyNode;for(int i = 0;i < n;i++){fast = fast.next;}while(fast.next != null){fast = fast.next;slow = slow.next;}slow.next = slow.next.next;return dummyNode.next;}
}

142.环形链表II

这道题老是犯一个错误,就是控制fast和slow相遇的循环条件写成fast != slow,slow和fast就移动,但是要注意一点,slow和fast在初始的时候就应该分别向下移动一位和两位,以防止while进入死循环。
在这里插入图片描述
定义slow和fast两个快慢指针,slow每次移动一位,fast每次移动两位,直到相遇。slow和fast走过的路程分别为
在这里插入图片描述
fast是slow的两倍,可以得到等式,最终得到x和z、y的关系式
在这里插入图片描述
这个时候slow和fast在同一位置,再定义一个res节点指针指向head,res和slow指针同时一位一位向下移动,当两个指针相遇的时候,这个节点就是环形的入口。
代码如下:

/*** Definition for singly-linked list.* class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode detectCycle(ListNode head) {if(head == null) return null;if(head.next == null || head.next.next == null) return null;ListNode fast = head.next.next;ListNode slow = head.next;while(fast != slow){if(fast.next != null && fast.next.next != null){fast = fast.next.next;}else{return null;}slow = slow.next;}ListNode res = head;while(slow != res){slow = slow.next;res = res.next;}return res;}
}

这里寻找fast和slow相遇节点的while循环可以优化一下:

/*** Definition for singly-linked list.* class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode detectCycle(ListNode head) {if(head == null) return null;if(head.next == null || head.next.next == null) return null;ListNode fast = head;ListNode slow = head;while(true){if(fast.next != null && fast.next.next != null) fast = fast.next.next;else return null;slow = slow.next;if(slow == fast) break;}ListNode res = head;while(slow != res){slow = slow.next;res = res.next;}return res;}
}

面试题 02.07. 链表相交

思路:
先计算出两条链表的长度,再将短的那一条链表的指针先移动链表长度差值个,然后再一起向下遍历直到相遇,如果没有相遇,最终都会到达null,返回停下之后的那个节点即可。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode curA = headA;ListNode curB = headB;int lengthA = 0;int lengthB = 0;while(curA != null){curA = curA.next;lengthA++;}while(curB != null){curB = curB.next;lengthB++;}if(lengthA > lengthB){for(int i = 0;i < lengthA-lengthB;i++){headA = headA.next;} }else{for(int i = 0;i < lengthB-lengthA;i++){headB = headB.next;} }while(headA != null && headA != headB){headA = headA.next;headB = headB.next;}return headA;}
}

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

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

相关文章

如何禁止U盘拷贝文件|禁止U盘使用的软件有哪些

禁止U盘拷贝文件的方法有很多&#xff0c;比如使用注册表、组策略编辑器等&#xff0c;但这些方法都适合个人&#xff0c;不适合企业&#xff0c;因为企业需要对下属多台电脑进行远程管控&#xff0c;需要方便、省时、省力的方法。目前来说&#xff0c;最好的方法就是使用第三方…

技术速递|无障碍应用程序之旅:键盘可访问性和 .NET MAUI

作者&#xff1a;Rachel Kang 排版&#xff1a;Alan Wang 首先让我们一起来看看您的应用程序是否支持键盘访问&#xff1a; 启动您的其中一个应用。如果您的设备尚未连接物理键盘&#xff0c;请连接物理键盘。像平常一样导航您的应用程序&#xff0c;并且仅使用键盘来执行此操…

如何使用Rust构建Python原生库?注意,不是动态链接库!!!

参考文档&#xff1a;https://github.com/PyO3/pyo3 创建python虚拟环境&#xff1a; conda create --name pyo3 python3.11.7激活虚拟环境&#xff1a; conda activate pyo3安装依赖&#xff1a; pip install maturin初始化项目&#xff1a; maturin init构建项目&#x…

小程序checkbox改成圆形与radio样式保持一致

修改前 修改后 html: <view class"agreement"><checkbox value"{{ isAgreed }}" bind:tap"toggleCheckbox" /><text>我同意室外智能健身房 <text class"link" bind:tap"showUserProtocol">用户协…

【JTS Topology Suite】Java对二维几何进行平移、缩放、旋转等坐标变换

JTS介绍 Github项目地址&#xff1a;https://github.com/locationtech/jts Maven库地址&#xff1a;https://mvnrepository.com/artifact/org.locationtech.jts JTS Topology Suite是一个用于创建和操作二维矢量几何的Java库。 JTS有对应的.NET版本NetTopologySuite库&…

2024目前网上最火短剧机器人做法,自动搜索发剧 自动更新资源 自动分享资源

目前整个项目圈子很多的短剧机器人&#xff0c;我写的&#xff0c;自动搜索发剧&#xff0c;自动更新资源&#xff0c;自动分享资源&#xff0c;前段时间大部分做短剧的都是做的短剧分成&#xff0c;我的一个学员做的30W播放量才200块收益&#xff0c;备受启发&#xff0c;我就…

springboot社区助老志愿服务系统-计算机毕业设计源码96682

摘要 大数据时代下&#xff0c;数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求&#xff0c;利用互联网服务于其他行业&#xff0c;促进生产&#xff0c;已经是成为一种势不可挡的趋势。在图书馆管理的要求下&#xff0c;开发一款整体式结构的社区助老志愿服务…

社交媒体数据恢复:绿洲

本教程将向您展示如何在绿洲平台上备份和恢复数据&#xff0c;但不涉及推荐任何具体的数据恢复软件。 一、绿洲平台数据备份 为了确保数据的安全&#xff0c;在日常使用过程中&#xff0c;我们需要定期备份绿洲平台上的数据。以下是备份绿洲平台数据的步骤&#xff1a; 登录绿…

three.js能实现啥效果?看过来,这里都是它的菜(09)

Hi&#xff0c;这是第九期了&#xff0c;继续分享three.js在可视化大屏中的应用&#xff0c;本期分享位移动画的实现。 位移动画 Three.js位移动画是指在Three.js中实现物体位置的平移动画。通过改变物体的位置属性&#xff0c;可以实现物体沿着指定路径从一个位置移动到另一…

Java——图书管理系统万字详解(附代码)

框架搭建 book包 将书相关的放到book包中&#xff0c;创建一个Book类用来设置书的属性&#xff0c;包括书名、作者、价格、类型、是否被借出等。 以上属性均被private所修饰 利用编译器生成构造方法&#xff08;不需要构造isBorrowed&#xff0c;因为其初始值为false&#…

springboot结合baomidou dynamic-datasource组件实现多数据源

dynamic-datasource组件实现多数据源 一、背景介绍二、 思路方案三、过程四、总结五、升华 一、背景介绍 博主最近研发的项目中由于业务需要&#xff0c;在项目中使用到多个数据源。使用到了baomidou的dynamic-datasource组件来实现访问不同的数据源。觉得挺有意思的也是进行了…

海外链游地铁跑酷全自动搬砖挂机掘金变现项目,号称单窗口一天收益30+(教程+工具)

一、项目概述 地铁跑酷海外版国外版自动搬砖挂机掘金项目是一款结合了地铁跑酷元素的在线游戏&#xff0c;为玩家提供一个全新的游戏体验&#xff0c;使得玩家可以轻松地进行游戏&#xff0c;无需手动操作&#xff0c;节省时间和精力。 二、游戏特点 1. 自动化操作&#xff1…

AI应用案例:影像报告智能辅助编辑系统

今天给大家介绍一个医疗行业的案例“影像报告智能辅助编辑系统”&#xff01;该案例已经在某三甲医院落地&#xff0c;模型准确度超过80%。 该项目上线后&#xff0c;保守估计&#xff0c;能为每位医生的每一张报告至少省下1分钟时间和2分钟的精力&#xff0c;20位初级医生&…

Django Web:搭建Websocket服务器(入门篇)

Django Web架构 搭建Websocket服务器&#xff08;1&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:htt…

如何在Windows 10上对硬盘进行碎片整理?这里提供步骤

随着时间的推移&#xff0c;由于文件系统中的碎片&#xff0c;硬盘驱动器可能会开始以较低的效率运行。为了加快驱动器的速度&#xff0c;你可以使用内置工具在Windows 10中对其进行碎片整理和优化。方法如下。 什么是碎片整理 随着时间的推移&#xff0c;组成文件的数据块&a…

LeetCode热题100——矩阵

73.矩阵清零 题目 给定一个 *m* x *n* 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 示例…

HTML+CSS 玻璃按钮

效果演示 Code <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>玻璃按钮</title><li…

设计模式 17 组合模式 Composite Pattern

设计模式 17 组合模式 Composite Pattern 1.定义 组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类型的设…

window好用的网速工具

这是一个用于显示当前网速、CPU及内存利用率的桌面悬浮窗软件&#xff0c;并支持任务栏显示&#xff0c;支持更换皮肤。 github链接如下 https://github.com/zhongyang219/TrafficMonitor?tabreadme-ov-file

无人机飞手:ASFC无人机和航模爱好者证书详解

ASFC无人机和航模爱好者证书是由中国航空运动协会&#xff08;ASFC&#xff09;颁发的一种无人机操作资格认证。这种证书在无人机和航模爱好者群体中享有广泛的认可度&#xff0c;并被视为操作无人机的一种重要资质。 ASFC证书的定义和用途十分明确。它是民航局颁发的民用无人驾…