题目:
一个链表中包含环,如何找出环的入口结点?
实现
public class Solution56 {
public static Node
findEntryNode(Node head){
if(head==
null){
return null;
}
Node slow = head;
Node quick = head;
boolean flag =
false;
while (quick !=
null && quick.next !=
null){
slow = slow.next;
quick = quick.next.next;
if(slow == quick){
flag =
true;
System.
out.println(
"有环");
break;
}
}
if(!flag){
System.
out.println(
"无环");
return null;
}
slow = head;
while (slow!=quick){
slow=slow.next;
quick=quick.next;
}
return slow;
}
public static void main(String[] args) {
test01();
test02();
test03();
}
private static void test01() {
Node n1 =
new Node(
1);
Node n2 =
new Node(
2);
Node n3 =
new Node(
3);
Node n4 =
new Node(
4);
Node n5 =
new Node(
5);
Node n6 =
new Node(
6);
n1.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
n5.next = n6;
Node result = findEntryNode(n1);
if (result !=
null) {
System.
out.println(result.
value);
}
}
private static void test02() {
Node n1 =
new Node(
1);
Node n2 =
new Node(
2);
Node n3 =
new Node(
3);
Node n4 =
new Node(
4);
Node n5 =
new Node(
5);
Node n6 =
new Node(
6);
n1.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
n5.next = n6;
n6.next = n3;
Node result = findEntryNode(n1);
if (result !=
null) {
System.
out.println(result.
value);
}
}
private static void test03() {
Node n1 =
new Node(
1);
Node n2 =
new Node(
2);
Node n3 =
new Node(
3);
Node n4 =
new Node(
4);
Node n5 =
new Node(
5);
Node n6 =
new Node(
6);
n1.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
n5.next = n6;
n6.next = n6;
Node result = findEntryNode(n1);
if (result !=
null) {
System.
out.println(result.
value);
}
}
}
证明