当前位置:首页 > 经验 >

单链表查找最大值(单链表按序查找思路)

来源:原点资讯(www.yd166.com)时间:2022-11-03 23:58:26作者:YD166手机阅读>>


单链表查找最大值,单链表按序查找思路(1)


一、序

本文继续給大家带来一道和单链表相关的算法题。

之前聊到,如何对单链表是否存在环进行检测,今天再来聊聊这个问题的进阶的题:

  • 一个单链表,如果有环,求环的入口。
  • 一个单链表,如果有环,求环的长度。

链表这种结构,可以通过「指针」,将一组零散的内存块串联起来。那单链表,如果有环是一个什么情况?

单链表查找最大值,单链表按序查找思路(2)

如上图所示,单链表中如果存在环,一定有且只有一个入口点,进去了就别想出来,接下来我们看看如何找到这个环的入口。

二、检测单链表环的入口

2.1 哈希法

哈希法的思路很简单,如果单链表上有环,那必然有一个链表上靠后的结点的 next 指针,指向了一个靠前的结点。

那么我们就可以通过一次循环加一个 Set 的辅助集合,来在每次循环的时候,判断结点是否在 Set 中,如果没有则将结点存入 Set 并继续循环,有则找到了链表的入口。

Listnode detectCycle(ListNode head) {   Set<ListNode> visited = new HashSet<>();   ListNode node = head;   while(node != null) {     if (visited.contains(node))       return node;     visited.add(node);     node = node.next;   } }

这种方式相对暴力,但是很好理解,只是需要额外消耗一个 Set 结构的空间,所以空间复杂度是 O(n)。同时它也是一种检测单链表是否有环的解法。

2.2 双指针法(Floyd算法)

在检测单向链表是否有环的解法中,还有一个比较经典的双指针来辅助计算,就是快慢指针

解题思路就是使用 2 个指针,快指针每次走 2 步,慢指针每次走 1 步,如果链表有环,那么它们肯定可以在环中相遇。就像两个人在圆形的赛道上赛跑,一个跑的快另一个跑的慢,最终肯定是跑的快的人,追上了跑的慢的。

不过想用双指针来确定单链表环的入口,思路上还有一些绕。

简单来说,当快、慢两个指针首次相遇后,再用两个指针,指针 A 指向首次相遇的结点,指针 B 移动到单链表的头结点,然后两个指针分别每次向前移动 1 步,最终相遇的地方,就是单链表成环的入口。

先来说说思路,我们首先假设环足够大,那么在这道题里,存在 3 个关键结点:链表头结点、环入口结点、快慢指针首次相遇结点。通过这三个点可以将指针移动的路径,分为 3 个区域。

单链表查找最大值,单链表按序查找思路(3)

从前面介绍的思路来说,当找到首次相遇点后,使用两个指针,指针 A 指向首次相遇的点,指针 B 指向链表头,两个指针继续同时向前走,每次走 1 步,最终会在链表环的入口处相遇。

单链表查找最大值,单链表按序查找思路(4)

首页 123下一页

栏目热文

单链表的插入结点图解(链表结点交换图解)

单链表的插入结点图解(链表结点交换图解)

单链表的删除和插入操作是线性表中比较重要的一部分,而这些操作又是线性表中的难点,同时也是考试的重点。对于初学者来说,在看...

2022-11-03 23:58:47查看全文 >>

单链表尾指针示意图(链表的节点图解)

单链表尾指针示意图(链表的节点图解)

作者:少年吉来源:微信公众号: 数据科学CLUB出处:https://mp.weixin.qq.com/s?__biz=...

2022-11-04 00:10:17查看全文 >>

单链表查找图示(三链表结构图解)

单链表查找图示(三链表结构图解)

电子计算机的本质是对输入(input)的数据进行处理(processing),对处理的结果形成输出(output)。程序...

2022-11-04 00:06:55查看全文 >>

单链表按序号查找(单链表按值查找操作)

单链表按序号查找(单链表按值查找操作)

严蔚敏《数据结构》笔记(1-4章)由于上传限制只能分章节上传,并且图片和公式可能无法上传出现乱码影响阅读。需要完整资料的...

2022-11-04 00:44:17查看全文 >>

单链表的创建图解(单链表的创建步骤)

单链表的创建图解(单链表的创建步骤)

创建单链表除了使用前插法,还可以使用后插法。后插法通过将新结点逐个插入到链表的尾部来创建链表。如下图所示根据上图所示,可...

2022-11-04 00:18:55查看全文 >>

单链表怎么加结点(单循环链表有头节点吗)

单链表怎么加结点(单循环链表有头节点吗)

链表是由节点组成的,节点中包含:数据域和指针域头指针(★):头指针的类型是struct Node *类型,指向链表的第一...

2022-11-04 00:36:18查看全文 >>

单链表查找原理(有序单链表查找方法)

单链表查找原理(有序单链表查找方法)

链表是线性表的链式存储结构,与数组不同的是,它是用一组任意的存储单元来存储线性表中的数据,存储单元不一定是连续的;链表的...

2022-11-04 00:11:15查看全文 >>

单链表算法详解(单链表的创建图解)

单链表算法详解(单链表的创建图解)

单链表结点定义以及操作函数声明我们知道在C语言里数组可以存储大量相同数据类型的数据,但是数组有个很明显的缺点就是大小固定...

2022-11-04 00:22:18查看全文 >>

链表表示队列图解(认识链表结构图解)

链表表示队列图解(认识链表结构图解)

表示形式队列的链表形式与单链表类似,只不过多了两个结点来保存首位结点一,关于链栈的结构体表示结构体定义第一种定义方法st...

2022-11-04 00:01:30查看全文 >>

q5l45tfsi变速箱型号(q5l40和45变速箱型号)

q5l45tfsi变速箱型号(q5l40和45变速箱型号)

奥迪Q5L有6款配置,动力上分为高功率版2.0T和低功率版2.0T两种,其中高功率版2.0T有4款车型,售价区间46.6...

2022-11-04 00:15:10查看全文 >>

文档排行