題目:
有一個單向鏈表,表中可能出現環,怎麼判斷是否有環。
思路:
首先創建兩個指針p1和p2,讓他們同時指向這個鏈表的頭結點,然後開始一個大的循環,在循環體中,讓指針p1每次向後移動一個結點,讓p2每次向後移動2個結點,然後比較兩個指針指向的結點是否相同,如果相同,則可以判斷出鏈表有環,如果不同,繼續下一次循環。
getRingLength則是來計算環長度的
public class isCycle {
public static boolean isCycle(Node head){
Node p1 = head;
Node p2 = head;
while(p2!=null && p2.next !=null){
p1 = p1.next;
p2 = p2.next.next;
if(p1 == p2){
return true;
}
}
return false;
}
public static int getRingLength(Node head){
int RingLength = 0;
Node fast = head;
Node slow = head;
for(;;){
fast = fast.next.next;
slow = slow.next;
RingLength++;
if(fast == slow){
break;
}
}
return RingLength;
}
private static class Node{
int data;
Node next;
Node(int data){
this.data = data;
}
}
public static void main(String[] args) throws Exception{
Node node1 = new Node(5);
Node node2 = new Node(3);
Node node3 = new Node(7);
Node node4 = new Node(8);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node2;
System.out.println(isCycle(node1));
System.out.println(getRingLength(node1));
}
}