141. Linked List Cycle [环形链表]

71 篇文章 0 订阅
7 篇文章 0 订阅
给定一个链表,判断链表是否存在环。通过设置快慢指针,快指针每次移动两步,慢指针每次移动一步。若快指针遇到慢指针,说明存在环;若快指针到达None,说明无环。
摘要由CSDN通过智能技术生成

描述

Given a linked list, determine if it has a cycle in it.
To represent a cycle in the given linked list, we use an integer pos which represents the position (0-indexed) in the linked list where tail connects to. If pos is -1, then there is no cycle in the linked list

给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环

例子
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:O(n)

先保证链表不为空:head !=NULL(C++) if head:(python)
快慢指针:low=head,fast=head.next , fast每次走两步,low每次走一步,如果存在环,fast==low一定存在。如果走到了None【只检测走得快的即可】,则无环
while (向前走的结点不为空)
答案

  • Java
public class Solution {
    public boolean hasCycle(ListNode head) {
        //处理无节点和一个节点
        if(head==null || head.next==null) return false;
        
        ListNode slow = head;
        ListNode fast = head.next;
        //有没有环?没有环,得到null
        while(fast!=null && fast.next!=null){
            if(fast==slow) return true;
            else{
                fast = fast.next.next;
                slow = slow.next;
            }
        }
        
        return false;
        
    }
}
  • python
	def hasCycle(self, head: ListNode) -> bool:
        if not head: return False
        fast = head.next
        while fast and fast.next:
            if fast == head:
                return True
            fast = fast.next.next
            head = head.next
                
        return False
public class Solution {
    public boolean hasCycle(ListNode head) {

        if (head==null) return false;
        //先进行一次:走一步,走两步 head head.next
        ListNode fast=head.next;
 		//如果不是循环链表,肯定会跳出循环
        while (fast!=null && fast.next!=null) {
            if (fast==head) return true;
            fast=fast.next.next;
            //因为fast在前面已经趟过了,没有null
            head=head.next;
        }
        return false;

        
        
    }
}
  • c++
    bool hasCycle(ListNode *head) {
        if (head==NULL) return false;
        
        ListNode* fast = head->next;
        while (fast!=NULL && fast->next !=NULL)
        {
        	if (fast == head) return true;
            fast = fast->next->next;
            head = head->next;
            
        }
        return false;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值