题目描述
判断给定的链表中是否有环
扩展:
你能给出空间复杂度O(1)的解法么?
题解:
方法一:
快慢指针法。慢指针一次走一步,快指针一次走两步,如果有环,快慢指针总会在某一点相遇。
方法二:
类似哈希法。遍历链表的每个节点,将其指针都指向head节点,如过存在环,则head一定会被再次访问
package com.wx.nowcoder;
public class NC4 {
//方法一:快慢指针
public boolean hasCycle1(ListNode head) {
if (head == null) return false;
ListNode p = head;
ListNode q = head;
while (p != null && q != null && q.next != null) {
p = p.next;
q = q.next.next;
if (p == q) {
return true;
}
}
return false;
}
//方法二:哈希法(类似)
public boolean hasCycle2(ListNode head) {
if (head == null) return false;
if (head.next == null) return false;
ListNode p = head;
ListNode q = head.next;
while (q != null) {
p.next = head;
p = q;
q = q.next;
if (q == head) {
return true;
}
}
return false;
}
public static void main(String[] args) {
ListNode head = new ListNode(1);
ListNode tail = new ListNode(2);
head.next = tail;
NC4 nc = new NC4();
boolean b = nc.hasCycle(head);
System.out.println(b);
}
}