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

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

系列文章目录

代码随想录算法训练营第一天|数组理论基础,704. 二分查找,27. 移除元素
代码随想录算法训练营第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
代码随想录算法训练营第三天|链表理论基础,203.移除链表元素,707.设计链表,206.反转链表

文章目录

  • 系列文章目录
  • 24. 两两交换链表中的节点
  • 19.删除链表的倒数第N个节点
  • 面试题 02.07. 链表相交
  • 142.环形链表II
  • 总结


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

题目链接: 24.两两交换链表中的节点
题目内容: 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
视频讲解:手把手带你学会操作链表 | LeetCode:203.移除链表元素

注意点: 1.最好设置一个虚拟节点方便操作;2.画图,不画图,操作多个指针很容易乱;3.要设置暂存节点,以防节点释放后找不到
在这里插入图片描述

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:dummyhead=ListNode(next=head)cur=dummyheadwhile cur.next is not None and cur.next.next is not None:#设置暂存节点指针temp1=cur.nexttemp2=cur.next.next.next#移动节点指针cur.next=cur.next.nextcur.next.next=temp1temp1.next=temp2#移动指针cur=cur.next.nextreturn dummyhead.next

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

题目链接: 19.删除链表的倒数第N个节点
题目内容: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
视频讲解: 链表遍历学清楚! | LeetCode:19.删除链表倒数第N个节点

核心思想:如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:dummyhead=ListNode(next=head)fast=dummyheadslow=dummyheadwhile n and fast.next is not None: fast=fast.nextn-=1while fast.next is not None:fast=fast.nextslow=slow.nextslow.next=slow.next.nextreturn dummyhead.next

面试题 02.07. 链表相交

题目链接: 面试题 02.07. 链表相交
题目内容: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

核心思想:求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:lenA,lenB=0,0#求链表A的长度cur=headAwhile cur:cur=cur.nextlenA+=1#求链表B的长度cur=headBwhile cur:cur=cur.nextlenB+=1curA,curB=headA,headB#使curB为最长链表的头,lenB为其长度if lenA > lenB:curA,curB=curB,curAlenA,lenB=lenB,lenA#让curA和curB在同一个起点上for _ in range(lenB-lenA):curB=curB.nextwhile curA:if curA==curB:return curAelse:curA=curA.nextcurB=curB.nextreturn None

142.环形链表II

题目链接: 142.环形链表
题目内容: 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。(不允许修改链表)
视频讲解: 把环形链表讲清楚! 如何判断环形链表?如何找到环形链表的入口?

核心思路:使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:fast=headslow=headwhile fast is not None and fast.next is not None:fast=fast.next.nextslow=slow.nextif slow==fast:slow=headwhile slow!=fast:slow=slow.nextfast=fast.nextreturn slowreturn None

总结

  1. 链表操作中一个非常重要的技巧:虚拟头节点。

    链表的一大问题就是操作当前节点必须要找前一个节点才能操作。这就造成了,头结点的尴尬,因为头结点没有前一个节点了。每次对应头结点的情况都要单独处理,所以使用虚拟头结点的技巧,就可以解决这个问题。

  2. 双指针法可以解决大部分链表操作的题。

相关文章:

  • 1panel中的sftpgo webadmin 更新修改docker容器文件的配置教程
  • 基于FFmpeg的简单Android视频播放器
  • 生物信息学中的可重复性研究
  • 大模型实战营Day3 作业
  • 【读书笔记】网空态势感知理论与模型(十)
  • SOMEIP学习总结
  • 二叉树的中序遍历【二叉树】【递归】
  • AI手写数字识别(二)
  • ES 之索引和文档
  • Jenkins-执行脚本案例-初步认识JenKins的使用
  • 系列十一、Spring Security登录接口兼容JSON格式登录
  • LeetCode第380场周赛个人题解
  • 时序预测 | MATLAB实现GRNN广义回归神经网络时间序列未来多步预测(程序含详细预测步骤)
  • HCIA-Datacom实验指导手册:1、华为 VRP 系统基本操作
  • Wargames与bash知识16
  • 77. Combinations
  • docker容器内的网络抓包
  • Go 语言编译器的 //go: 详解
  • Invalidate和postInvalidate的区别
  • Iterator 和 for...of 循环
  • Java基本数据类型之Number
  • mysql外键的使用
  • React-flux杂记
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Vue2.x学习三:事件处理生命周期钩子
  • Wamp集成环境 添加PHP的新版本
  • 对超线程几个不同角度的解释
  • 简单基于spring的redis配置(单机和集群模式)
  • 将 Measurements 和 Units 应用到物理学
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 为视图添加丝滑的水波纹
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 项目管理碎碎念系列之一:干系人管理
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • #pragma预处理命令
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (12)目标检测_SSD基于pytorch搭建代码
  • (二十三)Flask之高频面试点
  • (三)模仿学习-Action数据的模仿
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .Net MVC4 上传大文件,并保存表单
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • @Validated和@Valid校验参数区别
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ Linux ] Linux信号概述 信号的产生
  • [100天算法】-二叉树剪枝(day 48)
  • [2016.7.Test1] T1 三进制异或
  • [20171102]视图v$session中process字段含义