题目
一道老题目了:NC4 判断链表中是否有环 判断链表是否有环
解题思路
1.快慢指针!low一次走一步,fast一次走两步
class ListNode {
int val;
ListNode next;
ListNode ( int x) {
val = x;
next = null ;
}
}
public class Solution {
public static void main ( String [ ] args) {
Solution solution = new Solution ( ) ;
ListNode head = new ListNode ( 3 ) ;
head. next = new ListNode ( 2 ) ;
head. next. next = new ListNode ( 0 ) ;
head. next. next. next = new ListNode ( - 4 ) ;
head. next. next. next. next = head;
System . out. println ( solution. hasCycle ( head) ) ;
}
public boolean hasCycle ( ListNode head) {
if ( head == null ) {
return false ;
}
if ( head. next == null ) {
return false ;
}
ListNode p1 = head, p2 = p1;
while ( p1!= null && p2!= null ) {
p1 = p1. next;
if ( p1 == null ) {
return false ;
}
p2 = p2. next;
if ( p2 == null ) {
return false ;
} else {
p2 = p2. next;
}
if ( p1 == p2) {
return true ;
}
}
return false ;
}
}
哈希set
将所访问过的ListNode节点都存储到Set中,然后每次访问前检查是否有重复!
import java. util. * ;
public class Solution {
public boolean hasCycle ( ListNode head) {
if ( head == null ) {
return false ;
}
Set < ListNode > set = new HashSet < > ( ) ;
while ( head != null ) {
if ( ! set. contains ( head) ) {
set. add ( head) ;
head = head. next;
} else {
return true ;
}
}
return false ;
}
}