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

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

下面採用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; } }
相關文章
相關標籤/搜索