面试中算法(链表)

news2024/11/16 11:43:03

链表相关的题

    有一个单向链表,链表中有可能出现“环”,如图所示,如何用程序来判断该链表是否为有环链表呢?

对于这道题,有一个很巧妙的方法,这个方法利用了两个指针。

   首先创建两个指针pi和p2(在Python里就是两个对象引用),让它们同时指向这个链表的头节点。然后开始循环,在循环体中,让指针p1每次向后移动1个节点,让指针p2每次向后移动2个节点,然后比较两个指针指向的节点是否相同。如果相同,则可以判断出链表有环,如果不同,则继续下一次循环。

 第1步,p1和p2都指向节点10

 第2步,p1指向节点9,p2指向节点5

 第3步,p1指向节点5,p2指向节点6

 第4步,p1指向节点2,p2指向节点3

第5步,p1指向节点6,p2也指向节点6,p1和p2所指相同,说明链表有环。

     这个题类似于数学上的追及问题。在一个环形跑道上,两个运动员从同一地点起跑,一个运动员速度快,另一个运动员速度慢。当两人跑了一段时间后,速度快的运动员必然会再次追上并超过速度慢的运动员,原因很简单,因为跑道是环形的。

       如果链表的节点数量为n,则该算法的时间复杂度为O (n)。除两个指针外,没有使用任何额外的存储空间,所以空间复杂度是O(1)。

class MyNode:
    '''初始化节点'''
    def __init__(self,data):
        self.data=data
        self.next=None

def circle_linked(head):
    #p1,p2指针指向第一个
    p1=p2=head
    #循环判断
    while p1 is not None and p2.next is not None:
        #指针p1每次向后移动1个节点
        p1=p1.next
        #指针p2每次向后移动2个节点,
        p2=p2.next.next
        #判断如果相同,返回True
        if p1==p2:
            return True

    return False


if __name__ == '__main__':
     #节点数据
     n1=MyNode(10)
     n2=MyNode(9)
     n3=MyNode(5)
     n4=MyNode(2)
     n5=MyNode(6)
     n6=MyNode(8)
     n7=MyNode(3)
     #链表
     n1.next=n2
     n2.next=n3
     n3.next=n4
     n4.next=n5
     n5.next=n6
     n6.next=n7
     n7.next=n4

     #调方法
     print(circle_linked(n1))

扩展问题1: 如果链表有环,如何求出环的长度?

      当两个指针首次相遇,证明链表有环的时候,让两个指针从相遇点继续循环前进,并统计前进的循环次数,直到两个指针第2次相遇。此时,统计出来的前进次数就是环长。

环长=每一次速度差×前进次数

class MyNode:
    def __init__(self, data):
        self.data = data
        self.next = None


def hasCycle(head):
    # p1,p2指针指向第一个
    p1 = p2 = head
    #环长
    len = 0
    # 循环判断
    while p1 is not None and p2.next is not None:
        # 指针p1每次向后移动1个节点
        p1 = p1.next
        # 指针p2每次向后移动2个节点,
        p2 = p2.next.next
        # 判断如果相遇,就结束循环
        if p1 == p2:
            break
    #循环判断
    while (p2 != None) & (p2.next != None):
        p1 = p1.next
        p2 = p2.next.next
        len = len + 1
        if p1 == p2:
            break

    return len


if __name__ == '__main__':
     #节点数据
     n1=MyNode(10)
     n2=MyNode(9)
     n3=MyNode(5)
     n4=MyNode(2)
     n5=MyNode(6)
     n6=MyNode(8)
     n7=MyNode(3)
     #链表
     n1.next=n2
     n2.next=n3
     n3.next=n4
     n4.next=n5
     n5.next=n6
     n6.next=n7
     n7.next=n4

     #调方法
     print(hasCycle(n1))


 扩展问题2: 如果链表有环,如何求出入环节点? 

 抽象示意图:

        从链表头节点入环点的距离是D

        从入环点到两个指针首次相遇点的距离是S1

        从首次相遇点回到入环点的距离是S2

 

 

那么,当两个指针首次相遇时,各自所走的距离是多少呢?

指针p1一次只走1步,所走的距离是D+S1。

指针p2一次走2步,多走了n (n>=1)整圈,所走的距离是D+S1+n ( S1+S2)。

由于p2的速度是p1的2倍,所以所走距离也是pi的2倍,因此: 2(D+S1)=D+S1+n(S1+S2)

等式经过整理得出: D=(n-1)(S1+S2)+S2

 

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

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

相关文章

【问题分析】TaskDisplayArea被隐藏导致的黑屏以及无焦点窗口问题【Android 14】

1 问题描述 用户操作出的偶现的黑屏以及无焦点窗口问题。 直接原因是,TaskDisplayArea被添加了eLayerHidden标志位,导致所有App的窗口不可见,从而出现黑屏和无焦点窗口问题,相关log为: 这个log是MTK添加的&#xff0…

目标检测——YOLOv8算法解读

作者:Ultralytics公司 代码:https://github.com/ultralytics/ultralytics YOLO系列算法解读: YOLOv1通俗易懂版解读、SSD算法解读、YOLOv2算法解读、YOLOv3算法解读、YOLOv4算法解读、YOLOv5算法解读、YOLOR算法解读、YOLOX算法解读、YOLOv6算…

7. Django 模型与数据库

第7章 模型与数据库 Django对各种数据库提供了很好的支持, 包括PostgreSQL, MySQL, SQLite和Oracle, 而且为这些数据库提供了统一的API方法, 这些API统称为ORM框架. 通过使用Django内置的ORM框架可以实现数据库连接和读写操作. 本章以SQLite数据库为例, 分别讲述Django的模型…

统一威胁情报如何赋能SOC应对复杂威胁?

安全运营中心(SOC)是组织网络安全战略的核心组成部分,扮演着至关重要的角色。其负责实时监控整个IT基础设施,以检测、响应和预防各类网络安全威胁。网络安全威胁日益复杂且多变的数字化时代,攻击平面泛化、基础设施复杂…

10天精通Python爬虫:详细路线速成,开启兼职副业新篇章!

爬虫,即网络爬虫,是一种自动化程序,用于从互联网上抓取数据。在现代信息社会,爬虫技术广泛应用于数据分析、搜索引擎优化、竞品分析等领域。学习爬虫不仅可以提高数据处理能力,还可以为未来的职业发展打下坚实基础。 …

java基础之java容器-Collection,Map

java容器 java容器分类一. Collection1. List①. ArrayList② . LinkedList③ . Vector 2. Queue队列①. LinkedList②. PriorityQueue 3. Set集合①. HashSet②. TreeSet 二. Map1. HashMap2.TreeMap3. Hashtable java容器分类 java容器分为两大类,分别是Collecti…

修复所有 bug 并不能解决所有问题

原文:jeffpsherman - 2024.04.08 在软件领域,如同在制造业,有些问题是由于 bug 或“特殊原因”引发的,而有些则是“常见原因”,这是由于系统设计和实现的性质所导致的。修复 bug 就是移除特殊原因,消除 bu…

项目经理学习PMP对自己工作有多大帮助?

PMP是一种项目管理认证,也是最流行和含金量较高的认证之一。因此,你问它对项目管理有多大帮助,我可以说PMP可以被视为量身定制给项目管理岗人员的一个证书,你能理解它的重要性吗? 随着国家经济建设由基础设施向高端产业…

新闻 | 电子系协同智能中心与昌平区未来高教园及多所高校开展交流,共话智能无人平台建设

2024年4月8日,清华大学电子工程系在北京昌平两岸共盈科技产业园电子系地空协同智能无人平台基地成功举办“美团杯”智能无人机挑战赛,清华大学电子系党委书记沈渊、昌平区未来城管委会校城融合处处长熊玉川、清华大学团委副书记黄峰等出席。此外来自昌平…

CSS详解(一)

1、css工作中使用场景 美化网页(文字样式、背景样式、边框样式、盒子模型、定位、动画、),布局页面(flex布局、响应式布局、媒体查询) 2、CSS 规则 通常由两个主要部分组成选择器和样式声明 2.1选择器 选择器指定了…

Unity打包PC端exe,压缩打包为一个exe文件

目录 一.打包成功 1.打包输出文件 二.压缩输出目录为exe单个文件 1.添加到压缩文件 2.其他设置 1.点击“高级→自压缩选项” 2.修改解压后运行程序 3.设置模式 4.更新 三、生成.exe 一.打包成功 1.打包输出文件 1、一个后缀为 BurstDebugInformation_DoNotShip的文…

unittest断言_assert_使用python自带的断言

既可以使用: 1. self.assertEqual(ex1, ex2) #判断ex1 是否相等ex2 2. self.assertIn(ex1 ,ex2) # ex2是否包含ex1 注意:所谓的包含不能跳字符 3. self.assertTrue(ex) # 判断ex是否为True又可以使用: """目标断言扩展&…

C#实现 IDbConnection / IDbCommand 等相关通用数据接口

目录 关于数据接口 对象执行流程 范例运行环境 设计与实现 引用 GetConnection方法 GetCommand方法 GetParameter方法 小结 关于数据接口 在.net 应用中,与数据库进行连接、访问和执行经常会用到数据接口的相关对象,如下: 1、 Con…

【mysql】mysql命令使用大全,你想要的都在这里

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

《前端面试题》- React - 如何区分函数组件和类组件

问题 如何区分函数组件和类组件? 答案 可以使用instanceof 或者Component.prototype.isReactComponent。 示例 函数组件 export default function FunctionComonent() {if(FunctionComonent.prototype.isReactComponent){console.log(FunctionComonent是类组件…

前端JS必用工具【js-tool-big-box】,Number数值转换的方法调用学习

这一小节,我们针对前端工具包(npm)js-tool-big-box的使用做一些讲解,主要是针对Number数值型转换的一些方法使用。 目录 前言 1 安装和引入 2 千位逗号分割 3 判断是否大于0 4 判断是否大于0的整数 5 生成指定范围内的随机数…

Allegro画PCB时如何只删除走线的一部分

如何只删除走线的一部分 1、第一步: 2、第二步: 3、第三步,点击相应的走线段就能删除了。 说明:上面的Cline和Line只的是电线和线,您按下删除后,就可以删除这两种东西,但删除的是一整条折线.把这两个取消掉,换成Cline Segs和Ot…

计算机服务器中了helper勒索病毒怎么办,helper勒索病毒解密流程工具

在网络技术飞速发展的今天,越来越多的企业离不开网络,网络可以为企业带来更高的生产效率,提供更多的便捷服务,但网络是一把双刃剑,在为人们提供便利的同时,也为企业的数据安全带来严重威胁。近日&#xff0…

通过 API从 0 到 1 构建 本地 GPTs——1.构建Builder‘s Prompt

目的:帮助小白用户生成结构化 prompt 功能清单 搭建本地 gpts 能力,构建本地企业知识库助手Builder’s Prompt -对话引导构建 prompt 示例,生成助手信息function_call的用法prompt 示例 GPTs 的 Create 能力 用于引导用户构建结构化的 pr…

【数据分析面试】33.计算加权平均值 (Python: enumerate())

题目 假设你在分析薪资数据。经理让你使用最近加权平均值来计算平均薪资,并为提供了过去’n’年的数据。 最近加权应确保最近几年的薪资权重大于时间较久几年的薪资。 编写函数实现下面计算功能:输入previous_salaries是最近n年的薪资列表&#xff0c…