算法(10)-leetcode-explore-learn-数据结构-链表双指针技巧

leetcode-explore-learn-数据结构-链表2

  • 1.概述
  • 2.例题
    • 2.1 环形链表判断
    • 2.2 环形链表2
    • 2.3 相交链表
    • 2.4 删除链表的倒数第N个节点
  • 3.小结

本系列博文为leetcode-explore-learn子栏目学习笔记,如有不详之处,请参考leetcode官网:https://leetcode-cn.com/explore/learn/card/linked-list/

所有例题的编程语言为python

1.概述

两种使用双指针的技巧
(1).两个指针从不同的位置出发:一个从始端开始,另一个从末端开始
(2).两个指针以不同的速度移动:一个指针快一些,另一个指针慢一些
针对单链表:只能从一个方向遍历,所以单链表中的双指针技巧为第二种情形。

2.例题

2.1 环形链表判断

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

解法1: hash表。

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution(object):def hasCycle(self, head):""":type head: ListNode:rtype: bool"""if head==None or head.next==None:return Falsehas=[]r1=headwhile(r1):if r1 in has:return Truehas.append(r1)r1=r1.nextreturn False

解法2: 快慢指针
快指针一次跑两步,慢指针一次跑一步。如果无环,则快指针将先到达尾部;如果有环,快慢指针终将相遇。

class Solution(object):def hasCycle(self, head):""":type head: ListNode:rtype: bool"""if head==None or head.next==None:return Falseslow=headfast=head.nextwhile(slow!=fast):if fast==None or fast.next==None:return Falsefast=fast.next.nextslow=slow.nextreturn True

2.2 环形链表2

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

说明:不允许修改给定的链表。

解法1: hash表
思路在上题的基础上,如果有环,返回入环节点,而非true即可

class Solution(object):def detectCycle(self, head):""":type head: ListNode:rtype: ListNode"""if head==None or head.next==None:return Nonehas=[]r1=headwhile(r1):if r1 in has:return r1has.append(r1)r1=r1.nextreturn None

解法2:快慢指针,弗洛伊德算法
快慢指针会相遇,但不是在环的起点处,需要再遍历一次才能找到环的起点

class Solution(object):def detectCycle(self, head):""":type head: ListNode:rtype: ListNode"""if head==None or head.next==None:return Noneslow=headfast=head.nextwhile(slow!=fast):if fast==None or fast.next==None:return Nonefast=fast.next.nextslow=slow.nextfast=headslow=slow.nextwhile(slow!=fast):slow=slow.nextfast=fast.nextreturn slow

2.3 相交链表

判断两相交链表相交时的起始节点。–先判断两个链表相交否
创建两个指针 pa和 pb,分别初始化为链表 A 和 B 的头结点。然后让它们向后逐结点遍历。
当 pa 到达链表的尾部时,将它重定位到链表 B 的头结点 (你没看错,就是链表 B); 类似的,当 pb 到达链表的尾部时,将它重定位到链表 A 的头结点。
若在某一时刻 pa 和 pb 相遇,则 pa/pb 为相交结点。
(速度一样,走过相同的路径,如果有交点,必定会在交点处相遇)

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution(object):def getIntersectionNode(self, headA, headB):""":type head1, head1: ListNode:rtype: ListNode"""# 先判断有没有交点if headA==None or headB==None:return Nonepa=headApb=headBwhile(pa.next):pa=pa.nextwhile(pb.next):pb=pb.nextif pb!=pa:return Noneelse:pa=headApb=headBwhile(pa!=pb):if pa.next:pa=pa.nextelse:pa=headBif pb.next:pb=pb.nextelse:pb=headAreturn pa

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

首先我们将添加一个哑结点作为辅助,该结点位于列表头部。哑结点用来简化某些极端情况,例如列表中只含有一个结点,或需要删除列表的头部。
双指针解题

# Definition for singly-linked list.
class ListNode(object):def __init__(self, x):self.val = xself.next = Noneclass Solution(object):def removeNthFromEnd(self, head, n):""":type head: ListNode:type n: int:rtype: ListNode"""dummy=ListNode(0)dummy.next=headfirst,second=dummy,dummy#irst.next,second.next=head,headfor i in range(n):first=first.nextwhile(first.next!=None):second=second.nextfirst=first.nextsecond.next=second.next.nextreturn dummy.next

3.小结

注意事项:
1.在调用 next 字段之前,始终检查节点是否为空。
获取空节点的下一个节点将导致空指针错误。例如,在我们运行 fast = fast.next.next 之前,需要检查 fast 和 fast.next 不为空。

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

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

相关文章

一个简单的游戏服务器框架

最近看到百度空间的一个帖子,不错,在这里整理下,转载至我的博客里,开始自己慢慢琢磨写一个框架。 我先从上层结构说起,一直到实现细节吧,想起什么就写什么。 第一部分 服务器逻辑 服务器这边简单的分为三…

堆和栈的精华大总结

Java内存分配原理 栈、堆、常量池虽同属Java内存分配时操作的区域,但其适用范围和功用却大不相同。 一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但…

算法(11)-leetcode-explore-learn-数据结构-链表的经典问题

leetcode-explore-learn-数据结构-链表31.反转一个链表2.移除链表元素3.奇偶链表4.回文链表5.小结本系列博文为leetcode-explore-learn子栏目学习笔记,如有不详之处,请参考leetcode官网:https://leetcode-cn.com/explore/learn/card/linked-l…

探索式软件测试

James A.Whittaker [美] 詹姆斯惠特克(软件测试领域绝对的大师)著作《Exploratory Software Testing》,中文名《探索式软件测试》,记得当时被这本书深深吸引啦(我不知道有多少做测试的小伙伴看过这本书)&am…

Linux线程池的设计

我设计这个线程池的初衷是为了与socket对接的。线程池的实现千变万化,我得这个并不一定是最好的,但却是否和我心目中需求模型的。现把部分设计思路和代码贴出,以期抛砖引玉。个人比较喜欢搞开源,所以大家如果觉得有什么需要改善的…

算法(12)-leetcode-explore-learn-数据结构-双链表的设计

leetcode-explore-learn-数据结构-链表4双链表的设计本系列博文为leetcode-explore-learn子栏目学习笔记,如有不详之处,请参考leetcode官网:https://leetcode-cn.com/explore/learn/card/linked-list/所有例题的编程语言为python 双链表的设…

安全方面知识

什么是文件上传漏洞 文件上传漏洞是指 由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件 这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。 这种攻击方式是…

CE游戏外挂工具

CHEAT ENGINE(以下简称CE)是我见过的最优秀的游戏作弊工具。它的优点多不胜数,虽然单独从搜索游 戏里面的数值来说,它并不比其他同类软件强多少,但它不仅仅是个游戏修改工具,它还有其他游戏修改软件所没有的一些特点,例…

外挂编程-动作模拟技术

几乎所有的游戏都有大量繁琐和无聊的攻击动作以增加玩家的 功力,还有那些数不完的迷宫,这些好像已经成为了角色游戏的代名词。现在,外挂可以帮助玩家从这些繁琐而无聊 的工作中摆脱出来。 1. 鼠标模拟技术 几乎所有的游戏中都使用了鼠标来改变角色的位置和方向,玩家仅用…

算法(13)-leetcode-explore-learn-数据结构-链表小结

leetcode-explore-learn-数据结构-链表51.小结2.例题2.1合并两个有序链表思路1:迭代思路2:递归2.2 两数相加2.3 扁平化多级双向链表2.4 复制带随机指针的链表2.5 旋转链表本系列博文为leetcode-explore-learn子栏目学习笔记,如有不详之处,请参考leetcode…

leetcode121买卖股票的最佳时机

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。 注意你不能在买入股票前卖出股票。 示例 1: 输入: [7,1,5,3,6,…

epoll的内核实现

epoll是由一组系统调用组成。 int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout); select/poll的缺点在于&#xff1…

算法(14)-数据结构-二叉树

leetcode-explore-learn-数据结构-二叉树10.概述1.深度优先遍历dfs1.1先序遍历-中左右1.2中序遍历-左中右1.3后序遍历-左右中2.广度优先遍历bfs3.遍历-常见问题3.1 二叉树的最大深度自顶向下自底向上3.2对称二叉树3.3路径总和4.重构-常见问题4.1根据中序和后序遍历序列构造二叉…

多进程鱼多线程的权衡选择

最近有好多人在网上问道做游戏开发框架用多线程还是多进程呢,或者两者之间的优缺点,等等类似的问题。下边小高就带您小小分析一下: 1、首先要明确进程和线程的含义:进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一…

leetcode322 零钱兑换

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 示例 1: 输入: coins [1, 2, 5], amount 11 输出: 3 解释: 11 5 5 1 示例 2: 输入: coins [2],…

给数据减肥 让MySQL数据库跑的更快

在数据库优化工作中,使数据尽可能的小,使表在硬盘上占据的空间尽可能的小,这是最常用、也是最有效的手段之一。因为缩小数据,相对来说可以提高硬盘的读写速度,并且在查询过程中小表的内容处理时所占用的系统资源比较少…

算法(15)-leetcode-explore-learn-数据结构-运用递归解决二叉树的问题

leetcode-explore-learn-数据结构-二叉树2本系列博文为leetcode-explore-learn子栏目学习笔记,如有不详之处,请参考leetcode官网:https://leetcode-cn.com/explore/learn/card/data-structure-binary-tree/2/traverse-a-tree/7/

leetcode538 把二叉搜索树转换成累加树

给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。 对于每一个点来说,自己的父,和自己父的右子树都是大…

AWK常用命令华(1)

awk 调用: 1.调用awk:

AWk的调用精华

awk 的调用方式 awk 提供了适应多种需要的不同解决方案,它们是: 一、awk 命令行,你可以象使用普通UNIX 命令一样使用awk,在命令行中你也可以使用awk 程序设计语言,虽然awk 支持多行的录入,但是录入长长的命令行并保证其正 确无误却是一件令人头疼的事,因此,这种方法一般…