题目描述
判断给定的链表中是否有环。如果有环则返回true,否则返回false。 你能给出空间复杂度O(1)的解法么?
这道算法题在面试美团的时候,我居然没整出来,真是悲剧,今天我就来把他写出来,大家一起看看。
先来看看怎么写出一个循环链表吧,只有知道怎么来的才知道怎么解决这个算法对吧,首先是准备好class类:
static class ListNode {
public ListNode next;
public int val;
public ListNode(int val) {
this.val = val;
this.next = null;
}
}
然后就是根据ListNode实现链表环:
ListNode rN = null;
ListNode next = null;
ListNode n;
for (int i = 0; i < 5; i++) {
ListNode node = new ListNode(i);
if (rN == null) rN = node;
else if (rN.next == null) {
rN.next = node;
next = rN.next;
} else if (next != null && next.next == null) {
if (i == 4) node.next = rN;
n = next;
n.next = node;
next = n.next;
}
}
然后我们看看怎么解答这个算法题了,解题思路就是使用快指针和慢指针方式,快指针走两圈,慢指针才走一圈正好相等:
public boolean loopNode(ListNode head) {
if (head == null || head.next == null) return false;
ListNode low = head.next;
ListNode quick = head.next.next;
while (quick != null && quick.next != null) {
if (quick == low) return true;
low = low.next;
quick = quick.next.next;
}
return false;
}
是不是很简单,的确很简单就这个我当时还写错了,一个是由于自己太紧张,再一个的确是自己没注意自己的错误:
while (low != null && low.next != null) {
if (quick == low) return true;
low = low.next;
quick = quick.next.next;
}
这就是我当时的错误现在想想自己太蠢了,明显quick.next.next会报空指针错误自己竟然没看出来,其实使用了他们提供的网站跑了一下的确没有报出空指针所以自己也没发现,今天记录下来再也不犯这种低级错误了。