当前位置: 首页 > news >正文

[代码随想录Day4打卡] 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II 总结

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

题目:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
在这里插入图片描述
重点:

  1. 明确具体交换怎么做。交换其中1,2节点的示意图如下所示,总共有三步。但是在进行步骤一的时候会丢失cur->next的值,进行步骤2会丢失cur->next->next->next的值,进行步骤三虽然会丢失cur->next->next的值但是这个值我们是在第一步使用不是在后面步骤中使用,所以已经把它放到相应位置了。总体来说我们需要保存cur->next值和cu->next->next->next这两个节点。
    所以伪代码如下:
temp = cur.next;
temp1 = cur->next->next->next;
cur->next = cur->next->next;
cur->next->next = temp;
temp->next = temp1;
cur = cur->next->next;//移动两步

在这里插入图片描述
在这里插入图片描述
2. 明确循环的结束条件。对于链表长度为偶数的话,就是 c u r − > n e x t = = N u l l cur->next==Null cur>next==Null,对于链表长度为奇数的,就是 c u r − > n e x t − > n e x t = = N u l l cur->next->next==Null cur>next>next==Null。所以终止条件是 c u r − > n e x t = = N o n e ∣ ∣ c u r − > n e x t − > n e x t = = N u l l cur->next==None || cur->next->next==Null cur>next==None∣∣cur>next>next==Null,转换成程序就是while(cur->next!=Null && cur->next->next!=Null):
明确上面两个步骤就好写了,为了操作统一加上虚拟头节点。
下面是JAVA和Python代码:

class Solution {public ListNode swapPairs(ListNode head) {//建立虚拟头节点ListNode dummyhead = new ListNode(-1);dummyhead.next = head;ListNode cur = dummyhead;while(cur.next!=null && cur.next.next!=null){ListNode temp = cur.next;ListNode temp1 = cur.next.next.next;cur.next = cur.next.next;cur.next.next = temp;temp.next = temp1;cur = temp;}return dummyhead.next;}
}
class Solution(object):def swapPairs(self, head):""":type head: Optional[ListNode]:rtype: Optional[ListNode]"""dummy_head = ListNode(next=head)#设置虚拟头节点cur = dummy_headwhile(cur.next!=None and cur.next.next != None):temp = cur.nexttemp1 = cur.next.next.next#保存下一个节点和下下个节点cur.next = cur.next.nextcur.next.next = temptemp.next = temp1cur = tempreturn dummy_head.next

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

重点:删除链表中一个节点的时候需要定位到该节点的上一个节点。
思路:使用双指针,一个快指针一个慢指针,快指针先移动n+1步(为了获得被删除节点的前一个节点),然后快慢指针一起向前移动。
删除操作就是:slow->next = slow->next->next。(就把slow->next删除了,即被删除节点)

class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummyhead = new ListNode(-1);dummyhead.next = head;ListNode fast = dummyhead;ListNode slow = dummyhead;n++;while(n>0 && fast != null ){fast = fast.next;n--;}while(fast != null){fast = fast.next;slow = slow.next;}slow.next = slow.next.next;//删除指针的操作return dummyhead.next;}
}
class Solution(object):def removeNthFromEnd(self, head, n):""":type head: Optional[ListNode]:type n: int:rtype: Optional[ListNode]"""dummyhead = ListNode(-1)dummyhead.next = headn+=1fast = dummyheadslow = dummyheadwhile(n>0 and fast!=None):fast = fast.next#先移动N+1步n-=1while(fast!=None):fast = fast.nextslow = slow.nextslow.next = slow.next.nextreturn dummyhead.next

面试题 02.07. 链表相交

重点

  1. 是链表相等,不是值相等listnode1==listnode2就可以直接return listnode1(listnode2也可以)。
  2. 链表相交就是末尾的node都相同,需要末尾对齐,需要知道两个链表的长度。(刚开始一头雾水,后来看讲解明白了。)
    看如下两个链表,目前curA指向链表A的头结点,curB指向链表B的头结点:
    在这里插入图片描述
    我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图:
    在这里插入图片描述
    此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。

否则循环退出返回空指针。

PS:这个解释就直接抄代码随想录上的了。((●’◡’●))

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode curA = headA;ListNode curB = headB;int lenA = 0, lenB = 0;while(curA != null){lenA++;//求链表A的长度curA = curA.next;}while(curB != null){lenB++;curB = curB.next;}curA = headA;curB = headB;if(lenB > lenA){int tmpLen = lenA;lenA = lenB;lenB = tmpLen;ListNode tmpNode = curA;curA = curB;curB = tmpNode;}//交换是为了让A永远是长度最大的方便后续统一进行操作//求长度差int gap = lenA-lenB;//让curA和curB在同一起点上(末尾位置对齐)while(gap-->0){curA = curA.next;}//遍历curA和curB,遇到相同的则之间返回while(curA != null){if(curA == curB){return curA;}curA = curA.next;curB = curB.next;}return null;}
}

下面这个可以想象两个列表长度不相同,那么就是其中指针A先遍历完短的链表之后,再到长链表中,当指针B遍历完长的链表到短的链表上的时候,两个链表就实现了末尾对齐。(A指针在长链表的倒数len(短链表)的位置)

/*** 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 p1 = headA, p2 = headB;while(p1!=p2){//p1走一步,如果走到A链表的末尾,转换到B链表//极端情况就是A,B没有交点,而且长度不相等,p1和p2走完两个链表if(p1==null) p1 = headB;else p1 = p1.next;//p2也是,如果走到B链表的末尾就转换到A链表if(p2 == null) p2 = headA;else p2 = p2.next;}return p1;//p2也可以}
}

Python有不同的方法,我感觉思想应该相同就只看了一个。

class Solution(object):def getIntersectionNode(self, headA, headB):""":type head1, head1: ListNode:rtype: ListNode"""#求长度,同时出发lenA, lenB = 0, 0cur = headAwhile cur:cur = cur.nextlenA += 1cur = headBwhile cur:cur = cur.nextlenB += 1curA, curB = headA, headBif lenA > lenB:curA, curB = curB, curAlenA, lenB = lenB, lenA for _ in range(lenB - lenA): #让母后curA金额curB在末尾位置对齐curB = curB.nextwhile curA:if curA == curB:return curAelse:curA = curA.nextcurB = curB.nextreturn None

142.环形链表II

需要数学推导。
重点

  1. 判断有环:定义快慢指针,快指针每次移动两步,慢指针每次移动一步(两者相对速度为1),如果快慢指针相遇说明有环。
  2. 找到环的入口:两个指针从头节点和快慢指针相遇的地方同时移动,交点就是环形入口节点,视频很详细,需要数学推导。
    在这里插入图片描述
    JAVA和Python代码如下:
public class Solution {public ListNode detectCycle(ListNode head) {//快慢指针ListNode fast = head;ListNode slow = head;while(fast != null && fast.next != null){fast = fast.next.next;//k快指针每次移动两步,慢指针每次移动一步,这样相对速度是1,一定可以在环内相遇slow = slow.next;if(fast == slow){ListNode index1 = fast;ListNode index2 = head;while(index1 != index2){index1 = index1.next;index2 = index2.next;}return index1;}}return null;}
}
class Solution(object):def detectCycle(self, head):""":type head: ListNode:rtype: ListNode"""#下面这个是我根据伪代码写的fast = headslow = headwhile(fast!=None and fast.next!=None):fast = fast.next.nextslow = slow.nextif(fast == slow):#找到相遇点说明有环,找环的入口index1 = fast#相遇点index2 = headwhile(index1!= index2):index1 = index1.nextindex2 = index2.nextreturn index1return None

总结

我感觉对链表节点进行操作的话,使用虚拟头节点可以统一操作。
然后链表交换位置,改变顺序,一定记得断开一个连接(也就是对next节点赋值的时候),也会丢失一些信息,为了防止信息丢失,需要定义临时节点来存储。
双指针思想,还是很好用。
要求返回链表的话就是返回头指针。

参考的题目、文章、视频

  1. https://leetcode.cn/problems/swap-nodes-in-pairs/description/
  2. https://programmercarl.com/0024.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
  3. https://www.bilibili.com/video/BV1YT411g7br/
  4. https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/
  5. https://programmercarl.com/0019.%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%9A%84%E5%80%92%E6%95%B0%E7%AC%ACN%E4%B8%AA%E8%8A%82%E7%82%B9.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
  6. https://www.bilibili.com/video/BV1vW4y1U7Gf/?vd_source=145b0308ef7fee4449f12e1adb7b9de2
  7. https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/
  8. https://programmercarl.com/%E9%9D%A2%E8%AF%95%E9%A2%9802.07.%E9%93%BE%E8%A1%A8%E7%9B%B8%E4%BA%A4.html
  9. https://leetcode.cn/problems/linked-list-cycle-ii/description/
  10. https://programmercarl.com/0142.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8II.html
  11. https://www.bilibili.com/video/BV1if4y1d7ob/
  12. https://www.programmercarl.com/%E9%93%BE%E8%A1%A8%E6%80%BB%E7%BB%93%E7%AF%87.html

相关文章:

[代码随想录Day4打卡] 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II 总结

24. 两两交换链表中的节点 题目: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 重点: 明确具体交换怎么做。交换其中1,2…...

java项目之校园周边美食探索及分享平台(springboot)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的校园周边美食探索及分享平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 校园周边美食…...

支持 Mermaid 语言预览,用通义灵码画流程图

想像看图片一样快速读复杂代码和架构?通义灵码上新功能:智能问答支持 Mermaid 语言的预览模式,即支持代码逻辑可视化,可以把每段代码画成流程图,像脑图工具一样画出代码逻辑和框架。 操作步骤:选中代码块&a…...

cangjie仓颉程序设计-数据结构(四)

文章目录 ArrayListLinkedListHashSetHashMapTreeMap 本专栏还在持续更新: Cangjie仓颉程序设计-个人总结 这是双子专栏: 仓颉编程cangjie刷题录 这些数据结构都在std.collection.*中。暂时官方包还没有stack, queue等数据结构。服了 import std.coll…...

Redis中储存含LocalDateTime属性对象的序列化实现

目录 1.问题1 向Redis中存入序列化对象 1.1引入 : 1.2解决方案: 1.2.1首先引入依赖 1.2.2然后在RedisConfig中进行配置 1.3 介绍下ObjectMapper 1.3.1 ObjectMapper 1.3.2 objectMapper.registerModule(new JavaTimeModule()); 1.3.3 GenericJackson2Js…...

蚁剑的介绍和使用

蚁剑介绍 蚁剑(AntSword)是一个开源的跨平台网站管理工具,主要用于渗透测试和安全研究。它提供了一个图形化界面,方便用户管理和操作被攻陷的网站。 安装教程: github官网:https://github.com/AntSwordPro…...

C++之多态的深度剖析(2)

前言 在前面内容中,我们对多态进行了基本的了解,对其中的虚函数进行着重的介绍,本节内容我们将进一步对多态的底层进行观察了解看看它是如何实现的。 多态如何实现 从底层的角度Func函数中ptr->BuyTicket(),是如何作为ptr指向P…...

一篇文章 介绍 shiro反序列化漏洞

shiro反序列化漏洞 Shiro-550反序列化漏洞(CVE-2016-4437) 漏洞简介 shiro-550主要是由shiro的RememberMe内容反序列化导致的命令执行漏洞,造成的原因是默认加密密钥是硬编码在shiro源码中,任何有权访问源代码的人都可以知道默认加…...

pyav保存视频

目录 imageio替代pyav imageio替代pyav import imageio import numpy as np import torch# 创建一个随机的图像张量,形状为 (N, C, H, W) # 这里 N 30(帧数),C 3(通道数),H 64(…...

.bixi勒索病毒来袭:如何防止文件加密与数据丢失?

导言 在网络威胁剧烈的今天,勒索病毒已成为企业和个人面临的重大安全挑战,其中虫洞勒索病毒习得高强度的加密手段和急剧传播的特性引起关注。一旦感染,就会加密关键数据并索要赎金,导致数据无法访问并带来巨大的财务损失。更为严…...

MySQL安装配置教程

以下是 MySQL 在 Windows 系统下的安装配置教程: 1. 下载 MySQL 访问 MySQL 官方网站(https://dev.mysql.com/downloads/mysql/),根据您的操作系统版本(32 位或 64 位)选择合适的 MySQL 安装包。一般建议下载社区版(Community Server),它是免费且功能丰富的版本。2. …...

Pandas进行数据查看与检查

在数据分析的工作流中,数据的初步查看与检查是非常重要的步骤。通过这一步,可以快速了解数据的结构、属性以及一些关键的统计信息,确保数据符合预期,或者发现数据中的潜在问题。 借助 pandas 库中的常用方法,如 DataFrame.head()、DataFrame.tail()、DataFrame.info() 和…...

‌MySQL中‌between and的基本用法‌、范围查询

文章目录 一、between and语法二、使用示例2.1、between and数值查询2.2、between and时间范围查询2.3、not between and示例 BETWEEN AND操作符可以用于数值、日期等类型的字段,包括边界值。 一、between and语法 MySQL中的BETWEEN AND操作符用于在两个值之间选择…...

[ 问题解决篇 ] 解决远程桌面安全登录框的问题

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...

ctfshow——web(总结持续更新)

文章目录 1、基础知识部分2、php伪协议2.1 php://input协议2.2 data://text/plain协议 3、webshell连接工具3.1 蚁剑连接一句话木马 4、各个web中间件重要文件路径4.1 Nginx 5、sqlmap使用6、php特性6.1 md5加密漏洞 7、TOP 10漏洞7.1 SQL注入 1、基础知识部分 识别base64编码…...

selinux介绍和Linux中的防火墙

selinux 1、selinux的说明 2、selinux的工作原理 3、selinux的启动、关闭与查看 防火墙 1、什么是防火墙 2、iptables (1)iptables介绍 参数说明 3、firewalld firewalld-cmd的参数说明...

Jenkins面试整理-如何配置 Jenkins Pipeline?

在 Jenkins 中配置 Pipeline 是将构建、测试、部署等流程自动化的重要方式。Pipeline 可以通过一个名为 Jenkinsfile 的文件配置,它允许你使用脚本定义流水线。下面是如何在 Jenkins 中配置 Pipeline 的详细步骤。 步骤 1: 准备 Jenkinsfile Jenkinsfile 是 Jenkins Pipeline …...

Java每日刷题之二分算法

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode) 转化 通过题目时间复杂度为O(logN),我们就可以联想到二分算法,但是我们前面学到的算法,是查找出,有序数组里的值,并不是求其中的范围&a…...

【mod分享】极品飞车9仿虚幻引擎模组,支持光追,高清纹理材质,体验一会虚幻引擎风格的极品9

各位好,今天小编给大家带来一款新的高清重置MOD,本次高清重置的游戏叫《极品飞车9最高通缉》。 《极品飞车:最高通缉》作为一款2005年的游戏,《极品飞车:最高通缉》的画面效果还是可以的,效果全开之后很不…...

【启程Golang之旅】并发编程构建简易聊天系统

欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了…...

Redisson学习专栏(四):实战应用(分布式会话管理,延迟队列)

文章目录 前言一、为什么需要分布式会话管理?1.1 使用 Redisson 实现 Session 共享 二、订单超时未支付?用延迟队列精准处理2.1 RDelayedQueue 核心机制2.2 订单超时处理实战 总结 前言 在现代分布式系统中,会话管理和延迟任务处理是两个核心…...

2025年- H63-Lc171--33.搜索旋转排序数组(2次二分查找,需二刷)--Java版

1.题目描述 2.思路 输入:旋转后的数组 nums,和一个整数 target 输出:target 在 nums 中的下标,如果不存在,返回 -1 限制:时间复杂度为 O(log n),所以不能用遍历,必须使用 二分查找…...

2025年全国青少年信息素养大赛复赛C++算法创意实践挑战赛真题模拟强化训练(试卷3:共计6题带解析)

2025年全国青少年信息素养大赛复赛C++算法创意实践挑战赛真题模拟强化训练(试卷3:共计6题带解析) 第1题:四位数密码 【题目描述】 情报员使用4位数字来传递信息,同时为了防止信息泄露,需要将数字进行加密。数据加密的规则是: 每个数字都进行如下处理:该数字加上5之后除…...

仿真科普|弥合市场需求断层,高性能仿真,“性能”与“安全”如何兼得?

2025年3月,塔塔科技(Tata Technologies)确认曾在去年遭受勒索软件组织“猎手国际”(Hunters International)的攻击,1.4TB工程数据被窃取,涉及航空发动机热障涂层工艺参数等超过 73 万份文件。 X…...

灌水论坛系统总体设计文档

一、实验题目 灌水论坛系统 二、实验目的 旨在通过一个相对完整且功能丰富的Web应用实例,全面地实践和巩固Web开发所需的各项核心技术和工程方法,从而提升其综合应用能力和解决实际开发问题的能力。它不仅仅是完成一个软件,更是一个学习、…...

python实战项目71:基于Python的US News世界大学排名数据爬取

python实战项目71:基于Python的US News世界大学排名数据爬取 一、项目背景1.1 研究意义1.2 技术背景1.3 应用场景二、爬虫系统设计与实现2.1 分析页面、寻找数据真实接口2.2 发送请求,获取响应内容2.3 提取数据2.4 保存数据三、完整代码四、总结与展望一、项目背景 1.1 研究…...

腾讯云推出云开发AI Toolkit,国内首个面向智能编程的后端服务

5月28日,腾讯云开发 CloudBase 宣布推出 AI Toolkit(CloudBase AI Toolkit),这是国内首个面向智能编程的后端服务,适配 Cursor 等主流 AI 编程工具。 云开发 AI Toolkit旨在解决 AI 辅助编程的“最后一公里”问题&…...

【AI-安装指南】Redis Stack 的安装与使用

目录 一、Redis Stack 的介绍 二、安装方式 2.1 安装 2.2 添加依赖 2.3 设置配置信息 2.4 Redis 添加向量数据 2.5 查询向量数据 一、Redis Stack 的介绍 传统的 Redis 服务是不能存储向量的,因此我们需要首先安装 Redis Stack,而 Windows 电脑安 装 Redis Stack,官方…...

前端-不对用户显示

这是steam的商店偏好设置界面,在没有被锁在国区的steam账号会有5个选项,而被锁在国区的账号只有3个选项,这里使用的技术手段仅仅在前端隐藏了这个其他两个按钮。 单击F12打开开发者模式 单击1处,找到这一行代码,可以看…...

xhr、fetch和axios

XMLHttpRequest (XHR) XMLHttpRequest 是最早用于在浏览器中进行异步网络请求的 API。它允许网页在不刷新整个页面的情况下与服务器交换数据。 // 创建 XHR 对象 const xhr new XMLHttpRequest();// 初始化请求 xhr.open(GET, https://api.example.com/data, true);// 设置请…...