题目:
给定一个链表,判断链表中是否有环。
进阶:
你能否不使用额外空间解决此题?
代码:
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));
}
}