題目:
給定一個鏈表,判斷鏈表中是否有環。
進階:
你能否不使用額外空間解決此題?
代碼:
package leetCode;
import java.util.HashMap;
/**
*
* @author dhc
*
*/
public class OneHundredAndFourtyOne {
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
//思路:循環鏈表用一個map來存已經循環過的結點,
//並給這些結點一個大於0的value,然後每次每個幾點都判斷一下,這個節點的next是否在map中,如果存在則有環
public static boolean hasCycle(ListNode head) {1
if(head == null){
return false;
}
if(head.next == head){
return true;
}
boolean flag = false;
ListNode l = head;
int count = 1;
HashMap<ListNode,Integer> tem = new HashMap<ListNode,Integer>();
while(l != null){
//對於頭結點直接添加,
if(l == head){
tem.put(l,count);
count++;
l = l.next;
continue;
}else{//對於不是頭結點的滿足條件則是有環,退出循環
if(l.next !=null && tem.get(l.next) !=null && tem.get(l.next) > 0){
flag = true;
break;
}else{
tem.put(l,count);
count++;
l = l.next;
}
}
}
return flag;
}
//大佬答案,如果有環的話,在這個環內循環,總會有pre == cue;
public static boolean hasCycle1(ListNode head) {
if(head==null||head.next==null){
return false;
}
ListNode pre = head;
ListNode cur = head;
while(pre!=null&&pre.next!=null&&pre.next.next!=null){
cur = cur.next;
pre = pre.next.next;
System.out.println(cur.next);
System.out.println(pre.next);
if(pre == cur){
return true;
}
}
return false;
}
public static void main(String[] args) {
ListNode head = new OneHundredAndFourtyOne().new ListNode(1);
ListNode node1 = new OneHundredAndFourtyOne().new ListNode(2);
ListNode node2 = new OneHundredAndFourtyOne().new ListNode(3);
ListNode node3 = new OneHundredAndFourtyOne().new ListNode(3);
ListNode node4 = new OneHundredAndFourtyOne().new ListNode(4);
ListNode node5 = new OneHundredAndFourtyOne().new ListNode(5);
head.next = node1;
node1.next = node2;
node2.next = head;
/*node3.next = node4;
node4.next = node5;
node5.next = head;*/
System.out.println(hasCycle1(head));
}
}