无意中看到一个面试题,做次记录。
总结以上可能出现的情况:第一种情况,可以判断是否有一个节点的前一个和后一个是否相等
第二种情况,可以判断是否有节点出现两次
那第三种情况呢???
思考了一会,想出用hashcode,每遍历一个节点count++,并且把节点的hashcode放到set里面,若发现set.size和count不相等,就证明有环
上代码:
public class Node {
private Node next;
private String value;
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
public class Test02 {
public static void main(String[] args) {
Node node1 = new Node();
node1.setValue("01");
Node node2 = new Node();
node2.setValue("01");
node2.setNext(node1);
Node node3 = new Node();
node3.setValue("01");
node3.setNext(node2);
Node node4 = new Node();
node4.setValue("01");
node4.setNext(node3);
Node node5 = new Node();
node5.setValue("01");
node5.setNext(node4);
//node1.setNext(node3);
traverseList(node5);
}
/* 遍历链表 */
public static void traverseList(Node node) {
String ptr = node.getValue();
Integer count=0;
Set<Integer> stringSet = new HashSet<>();
if (ptr == null) {
System.out.println("链表为空\n");
} else {
while (node != null) {
stringSet.add(node.hashCode());
node = node.getNext();
count++;
if (count!=stringSet.size()){
System.out.println("*********存在环*******");
break;
}
}
}
if(count==stringSet.size()){
System.out.println("*****不存在环*******");
}
}
}
运行结果:
总结:无论是单项还是双向的链表,这个方法都可以。
我要刷100道算法题,第三道!!!