NC4题解 | #判断链表中是否有环#
判断链表中是否有环
http://www.nowcoder.com/practice/650474f313294468a4ded3ce0f7898b9
两种方法
1:HashSet去重
2:快慢指针:
先fast指针和slow指针同时出发,2步和1步,
循环条件:没有遍历完链表:(fast!=null && fast.next!=null)
跳出循环有两种情况:
没找到:fast==null || fast.next==null 返回false
找到了:以此为slow起点,fast重新从head出发,再次求相交点,即为相交点
代码:
1:HashSet去重
public boolean hasCycle1(ListNode head) {
HashSet<ListNode> set = new HashSet();
while(head!=null){
if(set.contains(head)){
return true;
}
set.add(head);
head = head.next;
}
return false;
}
2:快慢指针:
public boolean hasCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
//循环条件是未遍历完成
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
//找到了相交点
if(fast == slow){
break;
}
}
//遍历完了,没找到
if(fast == null || fast.next == null){
return false;
}
//遍历完了,找到了
fast = head;
while(fast != slow){
fast = fast.next;
slow = slow.next;
}
return true;
}