如何判断一个单链表是否有环?
public class LinkedListRing{
static class LinkedNode<T>{
private T t ;
private LinkedNode<T> next = null;
public LinkedNode(T t) {
this.t=t;
}
public LinkedNode<T> getNext() {
return next;
}
public void setNext(LinkedNode<T> next) {
this.next = next;
}
public String toString(){
return String.valueOf(t) ;
}
}
public static void main(String[] args) {
/**
* 造一个有环链表
*/
LinkedNode<String> l = new LinkedNode<String>("!");
LinkedNode<String> node = null;
LinkedNode<String> last = l;
for(int i=0;i<5;i++){
LinkedNode<String> temp = new LinkedNode<String>(i+"");
last.setNext(temp);
last = temp;
if(i==2){
node = temp;
}
if(i==4){
temp.setNext(node);
}
}
/**
* 寻找环入口
*/
System.out.println(findSingleLinkedRing(l));
}
/**
如何判断一个单链表是否有环?
有环返回进入环的第一个节点,无环返回空
时间复杂度O(N),额外空间复杂度O(1)
*
*
*/
public static LinkedNode<String> findSingleLinkedRing(LinkedNode<String> l){
LinkedNode<String> index1 = l;
LinkedNode<String> index2 = l;
try{
while(true){
/**
* 慢指针
*/
index1 = index1.getNext();
/**
* 快指针
* 无环会出java.lang.NullPointerException
*/
index2 = index2.getNext().getNext();
/**
* 无重复则不存在环点
*/
if(index1==null || index2 == null){
return null;
}
/**
* 有重复则将快指针从头单位步长执行,慢指针从之前重复位置执行
*
*/
if(index1 == index2){
index2 = l;
while(true){
index1 = index1.getNext();
index2 = index2.getNext();
/**
* 再次重合位置为入环位置
*/
if(index1 == index2){
return index1;
}
}
}
}
}catch(NullPointerException e){
return null;
}
}
}
共同学习,写下你的评论
评论加载中...
作者其他优质文章