1. 程式人生 > >單鏈表練習2

單鏈表練習2

1.判斷單鏈表是否帶環?若帶環,求環的長度?求環的入口點?

    單鏈表不同於陣列的是它的每個節點是由一個數據和一個指標構成,然後通過指標來實現連線,並不是陣列通過實體記憶體進行連線,所以單鏈表的尾節點可能指向任意位置,最常見的就是指向空,也存在可能它指向單鏈表中的某個節點,這就構成了一個迴圈,我們將這種現象形象的稱為這個單鏈表有一個環,既然有環就存在如何求環的入口點及環的長度,因為這兩個資料可以形象的描述一個環。
    首先,如何判斷環的存在,由上面可以知道環本質上就是一個迴圈,如果用一個指標的話程式必定陷入死迴圈。所以我們用兩個指標時就發現可以完成這個任務,我們定義兩個指標,一個快,一個慢,慢的如果能與快的相遇就說明存在迴圈,就是我們所說的環。因為如果不存在的話快指標一定會比慢指標先到達結尾。
    其次,判斷環的入口點,比較簡單的方法就是用上述的相遇點求出相遇點,然後通過一個定理,即相遇點與起點到入口點的距離相等,通過這個定理就可以求出入口點。
    最後,關於環的長度的的求法,通過上述的方法求出環的入口點,然後只需要設定一計數變數就可以,通過迴圈快速求出環的長度。

環形連結串列

2.判斷兩個連結串列是否相交,若相交,求交點。(假設連結串列不帶環)

   一般來說,聽到相交第一反應就是第一幅圖的樣子但是這種想法是錯的,因為雖然單鏈表是線性結構但是與直線還是有區別的,仔細想一下就會發現第一種根本無法實現,所以第二幅圖才正確的,這就是單鏈表的相交,所以我們就會發現這個問題十分簡單,我們只需要判斷結尾是否相同就可以判斷是否相交。

相交示意圖

3.判斷兩個連結串列是否相交,若相交,求交點。(假設連結串列可能帶環

如圖
分析圖 1.判斷是否都帶環。
2.判斷交點在環內還是環外。
3. 相交用判斷結尾的方法。
4. 用相遇的方法和定理求出入口點。