什麼是快慢指標?
快慢指標中的快慢指的是移動的步長,即每次向前移動速度的快慢。例如可以讓快指標每次沿鍊錶向前移動2次,慢指標每次向前移動1次。
快慢指標的常見應用
1.判斷單鏈表是否為迴圈鍊錶
對於初學迴圈鍊錶者,可能開始想到的方法就是使用雙重迴圈。當外層迴圈步進乙個節點時,內層迴圈就遍歷外層迴圈那節點之後的所有節點,然後比較內外迴圈的兩個節點。若有節點位址相等,則表明該單鏈表是有迴圈的,反之則不存在迴圈。這種方法無疑效率比較低。
而快慢指標應用於這個場景效率會明顯提高。就像生活中的乙個場景:一些人繞著環形跑道跑步,有的人快點,有的人慢點,過了一段時間會發現快的人又經過慢的人身旁,這就是迴圈跑。那麼如果是理想直線跑道的話,兩個人便不會相遇了,就沒有繞圈即迴圈的性質。
快慢指標的思想就是這樣。快指標每次步進多個結點(視情況而定),慢指標每次只步進乙個節點。那麼如果該鍊錶存在迴圈的話,快指標一定會再次碰到慢指標,反之則不存在迴圈。
**示例:
bool isloop(linklist l)
}return false;
}
例如長度為8,從1開始: 1
2345
6781
1357
1357
1 注:還有可能不直接是乙個環,而是部分有環。下面會說到如何找環的入口點。
2.在有序鍊錶中尋找中位數
該方法在不借助計數器變數的情況下,實現尋找中位數的功能。原理是:快指標的移動速度若是慢指標的2倍,當快指標到達鍊錶尾部時,慢指標到達中點。可以想到尾部和中點的情況和節點數的奇偶有關。例如移動次數若為x,若1+2x到達了表尾,鍊錶就有奇數個節點,此時慢指標為1+x,直接返回慢指標指向的資料即可。如果快指標指向倒數第二個節點,說明鍊錶節點數為偶數,這時可以根據「規則」返回上中位數(1+x內容),下中位數(1+x+1內容),或者上下的平均數。
**示例:
while(fast&&slow)
3.如果鍊錶存在環,怎麼找到環的入口點呢?
有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶的尾部形成環。
那麼問題來了,如何判斷乙個鍊錶是這類鍊錶呢?即如果鍊錶存在環,怎麼找到入口點呢?
① 如果迴圈方式為上圖所示,即尾部有迴圈,當fast(兩倍速)與slow相遇時,slow一定沒有走完鍊錶。
②如果迴圈入口點為頭結點,如上面**情況,那麼slow恰好遍歷一圈。
對於第一種情況(如上圖),我們從煉表頭a點與相遇點p點分別設定乙個指標,每次各走一步,兩個指標必定相遇(一定存在迴圈啦),且第一次相遇點就是環的入口了。
解釋:a點為出發點,fast和slow在p點相遇,所以a->b->p 步數等於p->b->p 所以a->b等於p->b 那麼如果在a點和p點分別設定乙個指標,每次各走一步,兩個指標就會在b點相遇,即相遇在環的入口處。
對於第二種情況,相遇點即煉表頭,也就是環的入口了。
**示例:
node* findloopport(node *head)
} if((fast==null)||(fast->next==null))//沒有return ,相遇了...
slow=head;//此時fast指在相遇點,slow回頭,期待再次相遇...
while(slow!=fast)
return slow;//又相遇了,相遇在了環的入口,return slow
}
4.擴充套件問題
判斷兩個單鏈表是否相交,如果相交,給出相交的第乙個點(兩個鍊錶都不存在環)。
比較好的兩個方法:
①將其中乙個鍊錶首尾相連,檢測另外乙個鍊錶是否存在環,如果存在,則兩個鍊錶相交,而檢測出來的第乙個入口即為相交的第乙個點。
②如果兩個鍊錶相交,兩個鍊錶從相交點到鍊錶結束都是相同的節點,我們可以先遍歷乙個鍊錶嗎,直到尾部,再遍歷另外乙個鍊錶,如果也可以走到同樣的結尾點,則兩個鍊錶相交。
這時我們記下兩個鍊錶length,再遍歷一次,長鍊表節點先出發前進lengthmax-lengthmin
步,之後兩個鍊錶同時前進,每次一步,相遇的第一點即為兩個鍊錶相交的第乙個點。
快慢指標的應用
1 definition for singly linked list.2 public class listnode 9 10 11public class solution 16 listnode slow head 17 listnode fast head 18while fast null...
C 快慢指標的應用
快慢指標的應用 1 判斷單鏈表是否存在環 如果鍊錶是乙個環,就好像操場的跑道是乙個環一樣,此時快慢指標都從煉表頭開始遍歷,快指標每次向前移動兩個位置,慢指標每次向前移動乙個位置 如果快指標到達null,說明鍊錶以null為結尾,沒有環。如果快指標追上慢指標,則表示有環。如下 bool hascirc...
快慢指標的常見應用
快慢指標 快慢指標是解決陣列和鍊錶問題的常用方法,該方法也被稱為 龜兔演算法 從名稱就可以看出氣基本思想是使用兩個指標以不同的速度在陣列或鍊錶中移動。在處理迴圈鍊錶或陣列時,此方法非常有用。快慢指標的應用 1 判斷單鏈表是否存在環 如果鍊錶存在環,就好像操場的跑道是乙個環形一樣,此時讓快慢指標都從煉...