判斷僅有指標域的單鏈表是否有環且怎麼找到環

2021-06-13 09:43:46 字數 1145 閱讀 2673

鍊錶結構如下:

struct listnode 

;

思路是:

1.設兩個指標p和q,p每次移動兩個節點(如果沒有走到結尾),q每次移動乙個節點,如果沒有環p會走到最後即p=null,如果有環的話,由於p走的塊,q走的慢,p在之後的某個時候會趕上q即p=q

時間複雜度有環時為o(n+k)(k為環包含節點數的一半),沒有環時時間複雜度為o(n),最後時間複雜度為o(n)

空間複雜度為o(1)

bool i***itsloop(slist *head)

return !(fast == null || fast->next == null);

}

找到環的入口點

當fast若與slow相遇時,slow肯定沒有走遍歷完鍊錶,而fast已經在環內迴圈了n圈(1<=n)。假設slow走了s步,則fast走了2s步(fast步數還等於s 加上在環上多轉的n圈),設環長為r,則:

2s = s + nr

s= nr

設整個鍊錶長l,入口環與相遇點距離為x,起點到環入口點的距離為a。

a + x = nr

a + x = (n – 1)r +r = (n-1)r + l - a

a = (n-1)r + (l – a – x)

(l – a – x)為相遇點到環入口點的距離,由此可知,從煉表頭到環入口點等於(n-1)迴圈內環+相遇點到環入口點,於是我們從煉表頭、與相遇點分別設乙個指標,每次各走一步,兩個指標必定相遇,且相遇第一點為環入口點。

程式描述如下:

slist* findloopport(slist *head)

if (fast == null || fast->next == null)

return null;

slow = head;

while (slow != fast)

return slow;

}

判斷單鏈表是否有環(快慢指標)

方法一 使用p q兩個指標,p總是向前走,但q每次都從頭開始走,對於每個節點,看p走的步數是否和q一樣。如圖,當p從6走到3時,用了6步,此時若q從head出發,則只需兩步就到3,因而步數不等,出現矛盾,存在環。方法二 使用p q兩個指標,p每次向前走一步,q每次向前走兩步,若在某個時候p q,則存...

判斷單鏈表是否有環

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...