| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 【算法刷题】第二篇——链表(二) -> 正文阅读 |
|
[数据结构与算法]【算法刷题】第二篇——链表(二) |
个人简介:?
前言:
?
目录 一:判断链表中是否有环1.题目描述判断给定的链表中是否有环。如果有环则返回true,否则返回false。 数据范围:链表长度0≤n≤10000,链表中任意节点的值满足?|val| <= 100000∣val∣<=100000 要求:空间复杂度?O(1)O(1),时间复杂度?O(n)O(n) 输入分为两部分,第一部分为链表,第二部分代表是否有环,然后将组成的head头结点传入到函数里面。-1代表无环,其它的数字代表有环,这些参数解释仅仅是为了方便读者自测调试。实际在编程时读入的是链表的头节点。 例如输入{3,2,0,-4},1时,对应的链表结构如下图所示: ? ? 可以看出环的入口结点为从头结点开始的第1个结点(注:头结点为第0个结点),所以输出true。 2.解题思路????????我们都知道链表不像二叉树,每个节点只有一个val值和一个next指针,也就是说一个节点只能有一个指针指向下一个节点,不能有两个指针,那这时我们就可以说一个性质:环形链表的环一定在末尾,末尾没有NULL了。为什么这样说呢?仔细看上图,在环2,0,-4中,没有任何一个节点可以指针指出环,它们只能在环内不断循环,因此环后面不可能还有一条尾巴。如果是普通线形链表末尾一定有NULL,那我们可以根据链表中是否有NULL判断是不是有环。 ????????但是,环形链表遍历过程中会不断循环,线形链表遍历到NULL结束了,但是环形链表何时能结束呢?我们可以用双指针技巧,同向访问的双指针,速度是快慢的,只要有环,二者就会在环内不断循环,且因为有速度差异,二者一定会相遇。 具体做法:
3.代码实现
二:链表中环的入口结点1.题目描述给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。 数据范围:n≤10000,1<=结点值<=100001<=结点值<=10000 要求:空间复杂度?O(1)O(1),时间复杂度?O(n)O(n) 例如,输入{1,2},{3,4,5}时,对应的环形链表如下图所示: ?? 可以看到环的入口结点的结点值为3,所以返回结点值为3的结点。 输入描述: 输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分,后台会根据第二段是否为空将这两段组装成一个无环或者有环单链表 返回值描述: 返回链表的环的入口结点即可,我们后台程序会打印这个结点对应的结点值;若没有,则返回对应编程语言的空结点即可。 2.解题思路
3.代码实现
三:链表中倒数最后k个结点1.题目描述输入一个长度为 n 的链表,设链表中的元素的值为 ai?,返回该链表中倒数第k个节点。 如果该链表长度小于k,请返回一个长度为 0 的链表。 数据范围:0≤n≤10^5,0≤ai?≤10^9,0≤k≤10^9 要求:空间复杂度?O(n)O(n),时间复杂度?O(n)O(n) 进阶:空间复杂度?O(1)O(1),时间复杂度?O(n)O(n) 例如输入{1,2,3,4,5},2时,对应的链表结构如下图所示: ? ? 其中蓝色部分为该链表的最后2个结点,所以返回倒数第2个结点(也即结点值为4的结点)即可,系统会打印后面所有的节点来比较。? 2.解题思路????????我们无法逆序遍历链表,就很难得到链表的倒数第k个元素,那我们可以试试反过来考虑,如果当前我们处于倒数第k的位置上,即距离链表尾的距离是k,那我们假设双指针指向这两个位置,二者同步向前移动,当前面个指针到了链表头的时候,两个指针之间的距离还是k。虽然我们没有办法让指针逆向移动,但是我们刚刚这个思路却可以正向实施。? 具体做法:
3.代码实现
四:删除链表的倒数第n个节点1.题目描述给定一个链表,删除链表的倒数第?n?个节点并返回链表的头指针 数据范围:?链表长度 0≤n≤1000,链表中任意节点的值满足0≤val≤100 要求:空间复杂度?O(1),时间复杂度?O(n) 2.解题思路? ? ? ? 对于这道题,还是采用快慢指针法,先让快指针走n步,然后对快指针进行判断,如果这时候快指针为空,说明要删除的结点为正数第一个,这时候只需要跳过第一个节点即可。否则则执行while循环,判断快指针下一个结点是否为空,若快指针下一个几点为空说明满指针这时候处在倒数第n个结点前一个结点,这时候只需要跳过慢指针下一个节点即可。 3.代码实现
今天的题目介绍就到这,实践才是检验真理的唯一标准,算法光看还不行,必须得自己动手练习,传送门链接,一键直达练习场?:牛客网? 刷题|面试|找工作神器?? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 21:50:01- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |