單鏈表是否有環的問題解決與討論(java實現)


單鏈表是否有環的問題經常在面試中遇到,一般面試中會要求空間為O(1);再者求若有環,則求環產生時的起始位置。

下面采用java實現。

//單鏈表
class
ListNode{ int val; ListNode next; ListNode(int x){ val=x; next=null; } } public class SearchCycleNode{ ListNode equalListNode=null;//來記錄判斷有環時出現的相等的時的節點,姑且叫"相遇"節點。
  //從"相遇"節點出發,第一個可達的節點(從單鏈表的頭節點開始)即是單鏈表的環產生的起始位置
public ListNode detectCycle(ListNode head) { if(!hasCycle(head)) return null; ListNode p=head; while(!isReach(p)){ p=p.next; } return p; }
//判斷從相遇的節點到 head節點可達性
private boolean isReach(ListNode head){ if(head==equalListNode)return true; ListNode p=equalListNode.next; while(p!=equalListNode){ if(p==head)return true; p=p.next; } return false; }
//判斷是否有環,通過一個指針p走一步,一個指針q走兩步,如果能出現p=q的情況,則有環,並記錄p為"相遇"節點。
private boolean hasCycle(ListNode head) { if(head==null)return false; if(head.next==null)return false; ListNode p=head; ListNode q=head.next; while(p!=q){ if(p.next==null)return false; p=p.next; if(q.next==null)return false; if(q.next.next==null)return false; q=q.next.next; } equalListNode=p; return true; } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM