链表如何判断有环,判断链表中是否有环代码
Bm判断链表中是否有环
知识点哈希双指针
确定给定的链表中是否有环。如果有环,则返回true,否则返回false。
数据范围:链表的长度,链表中任意节点的值满足
需求:空间复杂度,时间复杂度
输入分为两部分,第一部分是链表,第二部分表示是否有环,然后将组成的头节点传入函数。-1代表无循环,其他数字代表循环。解释这些参数只是为了方便读者自测和调试。在实际编程中,链表的头节点是读入的。
例如,当输入{3,2,0,-4},1时,对应的链表结构如下图所示:
可以看出,环的入口节点是从头节点开始的第一个节点(注:头节点是第0个节点),所以输出为真。
示例1输入:
{3,2,0,-4},1复制返回值:
真实副本描述:
第一部分{3,2,0,-4}表示一个链表,第二部分{1}表示从-4到位置1有一个链接(注意:头节点是位置0),也就是-4- 2,传入的头是一个有环的链表。返回true示例2输入:
{1},-1副本返回值:
虚假复印说明:
第一部分{1}表示链表,-1表示非循环单链表,传入头为非循环单链表,返回false。示例3输入:
{-1,-7,7,-4,19,6,-9,-5,-2,-5},6复制返回值:
真实的
解决方案想法:
用快慢指针来判断。起始位置是head,慢指针每次前进一个节点,快指针前进两个节点。如果快指针和慢指针相等,说明存在循环。
#包含位/标准数据。h
结构列表节点
{
int val
struct ListNode * next
ListNode(int x) : val(x),next(nullptr)
{
}
ListNode()=默认值;
};
bool hasCycle(ListNode *head)
{
if(head==nullptr head-next==nullptr)
{
返回false
}
自动慢=头;
auto fast=头;
而(快!=nullptr fast- next!=nullptr)
{
慢=慢-下一个;
fast=fast-next-next;
if(慢==快)
{
返回true
}
}
返回true
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。