思路:
1、快慢引用 fast 一次跑兩個,slow一次跑乙個兩者相遇有環,但相遇點不一定是入口點,如何證明是不是入口點? 快路徑長度=2慢路徑長度
2、**實現
public class link>
}return null;
}public void addhead(t value)else
}public void addtail(t value)else
}public void removehead()
headentry.setvalue(null);
headentry=headentry.getnext();
if(headentry==null)
}public void removetail()
if(headentry.getnext()==null)
tailentry.setvalue(null);//防止記憶體洩漏
//為尾巴找前驅
entrybeforetail=headentry;
for(;beforetail.getnext().getnext()!=null;beforetail=beforetail.getnext())
//找到尾巴前驅
tailentry=beforetail;
tailentry.setnext(null);//新尾部結點next=null
beforetail.setnext(null);
}public void removevalue(t value)
if(headentry.getvalue().compareto(value)==0)
return;
}//p儲存要刪結點的前驅結點
for(entryp=headentry;p.getnext()!=null;p=p.getnext())}}
public void show()
system.out.println();
}private int getlength()
return count;
}public entryiscircle()
slow=slow.getnext();
fast=fast.getnext().getnext();
}while (fast!=slow);
return slow;
}//輸出環的入口結點:當前鍊錶環的入口結點
public entrygetcirclemeetentry()
entryp=headentry;
entryq=meet;
while (p!=q)
return p;
}}
判斷單鏈表是否有環
1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,fas...
判斷單鏈表是否有環
鍊錶結構 struct list 1 判斷單鏈表是否有環 採用追趕法,設定兩個指標p和q,從煉表表頭開始,p每一步走兩個節點,q每一步走乙個節點,如果鍊錶有環則p和q必相遇。如下 判斷鍊錶是否有環,時間複雜度o n 空間複雜度o 1 list hasloopinlist list head else...
判斷單鏈表是否有環
1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,fas...