随笔 - 112  文章 - 0  评论 - 0  阅读 - 1384

判断链表中是否有环

  • 描述
判断给定的链表中是否有环。如果有环则返回true,否则返回false。
 
数据范围:链表长度 0n10000,链表中任意节点的值满足 val<=100000
要求:空间复杂度 O(1),时间复杂度 O(n)
 
输入分为两部分,第一部分为链表,第二部分代表是否有环,然后将组成的head头结点传入到函数里面。-1代表无环,其它的数字代表有环,这些参数解释仅仅是为了方便读者自测调试。实际在编程时读入的是链表的头节点。
 
例如输入{3,2,0,-4},1时,对应的链表结构如下图所示:
可以看出环的入口结点为从头结点开始的第1个结点(注:头结点为第0个结点),所以输出true。
 
  • 示例1
输入:{3,2,0,-4},1
返回值:true
说明:第一部分{3,2,0,-4}代表一个链表,第二部分的1表示,-4到位置1(注:头结点为位置0),即-4->2存在一个链接,组成传入的head为一个带环的链表,返回true  
 
  • 示例2
输入:{1},-1
返回值:false
说明:第一部分{1}代表一个链表,-1代表无环,组成传入head为一个无环的单链表,返回false
 
  • 示例3
输入:{-1,-7,7,-4,19,6,-9,-5,-2,-5},6
返回值:true
 
  • 算法思想

1、设置快慢两个指针,初始都指向链表头。

2、遍历链表,快指针每次走两步,慢指针每次走一步。

3、如果快指针到了链表末尾,说明没有环,因为它每次走两步,所以要验证连续两步是否为NULL。

4、如果链表有环,那快慢双指针会在环内循环,因为快指针每次走两步,因此快指针会在环内追到慢指针,二者相遇就代表有环。

 

  • 代码
复制代码
 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     bool hasCycle(ListNode *head) {
12         ListNode *slow=head;
13         ListNode *fast=head;
14         //使用快慢指针
15         while(fast&&fast->next){
16             fast=fast->next->next;
17             slow=slow->next;
18             if(fast==slow)
19             return true;
20         }
21         return false;
22     }
23 };
复制代码

 

参考:题解 | #判断链表中是否有环#_牛客博客 (nowcoder.net)

 
posted on   _月生  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示