1. 问题描述:
给定一个有环的链表,实现一个算法返回环路的开头节点
有环链表的定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路
2. 这个我们使用到了一个对于判断是否有重复元素非常有效的数据结构:HashSet,遍历链表判断当前的HashSet中是否有当前指针指向的元素,如果没有则加入当前元素,如果有那么直接返回这个节点的指针就可以了
3. 具体的代码如下:
import java.util.HashSet;
public class Main {
private static class ListNode{
private ListNode next;
int value;
public ListNode(int value) {
super();
this.value = value;
}
}
public static void main(String[] args) {
//使用一个数据结构HashSet来记录是否重复,使用这个是十分有效的
ListNode node = new ListNode(1);
node.next = new ListNode(2);
node.next.next = new ListNode(3);
node.next.next.next = new ListNode(4);
node.next.next.next.next = new ListNode(5);
//创建环路
node.next.next.next.next.next = node.next.next;
node = circleLinedList(node);
System.out.println(node.value);
}
private static ListNode circleLinedList(ListNode node){
ListNode p = node;
HashSet<Integer> set = new HashSet<Integer>();
while(p != null){
if(set.contains(p.value)) return p;
set.add(p.value);
p = p.next;
}
return null;
}
}