有環鏈表的問題解決思路

2021-08-10 17:43:30 字數 1129 閱讀 2531

問題:

判斷乙個鍊錶中是否有環。

分析:我們都知道,當乙個鍊錶中沒有環時,我們使用乙個指標能從頭遍歷到尾;當鍊表中有環時,鍊錶會在環中旋轉。

當我們使用兩個指標時【鍊錶操作的常用技巧!】,可以設定快、慢兩個指標。

如果鍊錶中不存在環,快指標肯定最終變為null;存在環的話,快指標和慢指標都會進入到環中,因為慢指標相對快指標靜止,快指標相對對慢指標步伐為1,最終快指標一定能趕上慢指標。

此方法時間複雜度為o(n),空間複雜度為o(1)

2)使用快、慢指標。

bool ishascycle(node* head) const

return

false

;}

問題:尋找乙個有環鏈表的第乙個入環節點。

分析:2)當我們使用快慢指標時,兩個節點會相遇。

假設直線階段長度為l,兩個指標的相遇點距環的起始點距離為t,這個環的長度為s。

我們讓慢指標從head處開始運動,每次向前走一步;快指標從head->next處開始運動,每次向前走兩步。

當兩個指標相遇時,快指標旋轉了m圈,慢指標旋轉了n圈。

(l + m×s + t - 1) / 2 = (l + n×s + t) 【時間相同】

=> (m - 2×n)×s = t + l + 1

=> (m - 2×n - 1)×s + s - t = l + 1

顯然,相遇後,讓乙個指標從鍊錶起始處開始運動,另乙個指標從相遇點的下乙個節點開始運動。這樣,兩個指標會在鍊錶的起始節點相遇。

node* first_node_in_cycle(node* head) const

fast = fast->next;

slow =head;

while(fast !=slow)

return

fast;

}

問題:求有環鏈表的環的長度。

解答:在前兩問的基礎之上。

2)使用快、慢指標時,我們可以在指標相遇後,固定乙個指標,然另乙個指標運動。當兩個指標再次相遇時,就是一圈的距離。

時間複雜度o(n),空間複雜度o(1)。

Mysql問題解決思路

資料庫層面 一 檢查問題常用工具 1 msyqladmin mysql客戶端,可進行管理操作 2 mysqlshow 功能強大的檢視shell命令 3 show session global variables 檢視資料庫引數資訊 4 show session global status 檢視資料庫...

約瑟夫環問題解決

問題描述 編號為1 n的n個士兵圍坐在一起形成乙個圈,從編號為1的士兵依次開始報數 1,2,3.依次報 數到m的士兵會被殺死出列,之後的士兵再從1開始報數。直到最後剩下一士兵。求這個士兵的編號。方法一 陣列 第一次做這個題的時候,第一反應就是用陣列來做。建立乙個boolean陣列,用true表示沒出...

「奇怪」問題解決思路整理

處理過各種各樣的 奇怪 問題,當然一般的問題,也不會找我處理 雖然每個問題最終產生的原因有各種各樣,但還是有些套路可以整理的 可以從以下幾個方面入手 準確描述問題現象,很重要。以下幾個點可以捋一下 1.現象能否重現?在什麼條件可以出現?重現頻率 分 極少出現,偶爾出現,頻繁出現,100 出現 2.出...