【剑指offer】判断单链表是否有环

题目:

给定一个链表,判断链表中是否有环。

分析:

快慢指针法:

我们知道,假设一个链表有环,那么它就永远走不到头。

设定有两个指针,一个快指针,一个慢指针。其中,快指针一次遍历两个节点;慢指针遍历一个节点,它们都是从头开始往后遍历所有的节点。

如果链表中没有环,那么快指针与慢指针都会先后遍历完所有的节点。

如果链表中有环,则快慢指针会进入环中直到某次的遍历时相遇。一旦相遇,就证明该链表中存在环。

package swordOffer;

import swordOffer.EntryNodeOfLoop.ListNode;

public class hasCycle {
	public static class ListNode {
	    int val;
	    ListNode next = null;

	    ListNode(int val) {
	        this.val = val;
	    }
	}
	
	public static boolean hasCycle(ListNode node) {
		if(node == null) {
			return false;
		}
		
		ListNode quick = node;
		ListNode slow = node;
		
		while(quick != null) {
			slow = slow.next;//first指针走一步
			quick = quick.next.next; //second指针走两步
			
			if(quick == slow) { //一旦两个指针相遇,说明链表是有环的
				return true;
			}
		}
		return false;
	}
}

猜你喜欢

转载自blog.csdn.net/volcano1995/article/details/88681157
今日推荐