[LeetCode]Linked List Cycle

本文介绍了一种不使用额外内存空间判断单链表中是否存在环路的方法,通过快慢指针的策略实现。该算法利用快指针每次走一步,慢指针每次走两步的特点,若链表存在循环,则快慢指针最终会在某节点汇合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:给定一个单链表,判断链表是否存在环路(能否不使用额外内存空间)

算法:快慢指针

原理:每次,快指针走一步,慢指针走两步,若链表存在循环,则快慢指针最终必定会在某个节点汇合,否则直到遍历完整个链表都不会汇合

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
	    	if (null==head || null==head.next) {
	    		return false;
	    	}
	    	
	    	ListNode fast = head;  // fast pointer take one step
	    	ListNode slow = head.next.next;  // slow pointer take two steps
	    	while (null!=fast && null!=slow) {
	    		if (fast == slow) {
	    			// fast pointer meet slow pointer, it means list has cycle!
	    			return true;
	    		}
	    		
	    		if (null == slow.next) {
	    			// it mean slow pointer has reach the list tail! No cycle!
	    			return false;
	    		}
	    		else {
	    			fast = fast.next;
		    		slow = slow.next.next;
	    		}
	    	}
	    	return false;
	    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值